Cara mudah untuk mencetak Perl array? (dengan sedikit format)


97

Apakah ada cara mudah untuk mencetak larik Perl dengan koma di antara setiap elemen?

Menulis perulangan for untuk melakukannya cukup mudah tetapi tidak cukup elegan .... jika itu masuk akal.

Jawaban:


150

Gunakan saja join():

# assuming @array is your array:
print join(", ", @array);

9
Atau, jika Anda ingin benar-benar kotor: {local $,=', ';print @array}.
musiKk

10
Ada lebih dari satu cara untuk melakukannya .. tetapi ini adalah cara yang tidak membuat orang memelihara kode setelah Anda membenci Anda. Ya, perldoc perlvar memang ada, tapi saya lebih suka melihat "join ',' @array" daripada menekan perlvar setiap baris lain untuk mencari tahu apa yang dilakukan semua variabel esoterik.
Oesor

@Oesor: Itu sebabnya saya menyebutnya kotor. Tapi, melihat jawaban lain, saya sebenarnya bukan pelanggar terburuk. :)
musiKk

@musiKK Saya menyukainya! Itu adalah sesuatu yang akan saya gunakan jika saya ingin membingungkan rekan kerja saya. :)
Alex

3
Ini bekerja dengan sangat baik untuk mencetak isi direktori. print "current directory contains " . join(', ', <*>) . "\n";
Randall


18

Jika Anda membuat kode untuk jenis kejelasan yang akan dipahami oleh seseorang yang baru memulai dengan Perl, konsep tradisional ini menjelaskan artinya, dengan tingkat kejelasan dan keterbacaan yang tinggi:

$string = join ', ', @array;
print "$string\n";

Konstruksi ini didokumentasikan di perldoc -fjoin .

Namun, saya selalu menyukai betapa sederhana $,membuatnya. Variabel khusus $"untuk interpolasi, dan variabel khusus $,untuk daftar. Gabungkan salah satu dengan pembatasan lingkup dinamis ' local' untuk menghindari efek riak di seluruh skrip:

use 5.012_002;
use strict;
use warnings;

my @array = qw/ 1 2 3 4 5 /;

{
    local $" = ', ';
    print "@array\n"; # Interpolation.
}

ATAU dengan $ ,:

use feature q(say);
use strict;
use warnings;

my @array = qw/ 1 2 3 4 5 /;
{
    local $, = ', ';
    say @array; # List
}

Variabel khusus $,dan $"didokumentasikan dalam perlvar . Kata localkunci, dan bagaimana dapat digunakan untuk membatasi efek mengubah nilai variabel tanda baca global mungkin paling baik dijelaskan di perlsub .

Nikmati!


10

Juga, Anda mungkin ingin mencoba Data :: Dumper . Contoh:

use Data::Dumper;

# simple procedural interface
print Dumper($foo, $bar);

4
Data :: Dumper adalah modul standar dan diinstal bersama Perl. Untuk mendapatkan daftar semua pragmatik dan modul standar, lihat pelrdoc perlmodlib.
shawnhcorey

7

Untuk pemeriksaan / debugging, periksa Data::Printermodulnya. Ini dimaksudkan untuk melakukan satu hal dan hanya satu hal:

menampilkan variabel Perl dan objek di layar, diformat dengan benar (untuk diperiksa oleh manusia)

Contoh penggunaan:

use Data::Printer;  
p @array;  # no need to pass references

Kode di atas mungkin menghasilkan sesuatu seperti ini (dengan warna!):

   [
       [0] "a",
       [1] "b",
       [2] undef,
       [3] "c",
   ]

Di bawah Ubuntu seseorang dapat menginstal libdata-printer-perlpaket.
planetp

3

Anda bisa printmelakukannya.

@a = qw(abc def hij);

print "@a";

Anda akan mendapatkan:

abc def hij

1
Anda memiliki koma di cetakan karena mereka ada di setiap elemen array. Anda benar-benar harus mendeklarasikan use warnings;dan melihat apa yang dikatakannya.
Toto

2
# better than Dumper --you're ready for the WWW....

use JSON::XS;
print encode_json \@some_array

1

Menggunakan Data::Dumper:

use strict;
use Data::Dumper;

my $GRANTstr = 'SELECT, INSERT, UPDATE, DELETE, LOCK TABLES, EXECUTE, TRIGGER';
$GRANTstr    =~ s/, /,/g;
my @GRANTs   = split /,/ , $GRANTstr;

print Dumper(@GRANTs) . "===\n\n";

print Dumper(\@GRANTs) . "===\n\n";

print Data::Dumper->Dump([\@GRANTs], [qw(GRANTs)]);

Menghasilkan tiga gaya keluaran yang berbeda:

$VAR1 = 'SELECT';
$VAR2 = 'INSERT';
$VAR3 = 'UPDATE';
$VAR4 = 'DELETE';
$VAR5 = 'LOCK TABLES';
$VAR6 = 'EXECUTE';
$VAR7 = 'TRIGGER';
===

$VAR1 = [
          'SELECT',
          'INSERT',
          'UPDATE',
          'DELETE',
          'LOCK TABLES',
          'EXECUTE',
          'TRIGGER'
        ];
===

$GRANTs = [
            'SELECT',
            'INSERT',
            'UPDATE',
            'DELETE',
            'LOCK TABLES',
            'EXECUTE',
            'TRIGGER'
          ];

1

Ini mungkin bukan yang Anda cari, tapi inilah yang saya lakukan untuk sebuah tugas:

$" = ", ";
print "@ArrayName\n";

0

Peta juga dapat digunakan, tetapi terkadang sulit dibaca saat Anda memiliki banyak hal.

map{ print "element $_\n" }   @array; 

0

Tapi aku belum mencoba lari di bawah. Saya pikir ini cara yang rumit.

map{print $_;} @array;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.