Perl dizisini yazdırmanın kolay yolu? (biraz biçimlendirmeyle)


98

Her eleman arasında virgül bulunan bir Perl dizisi yazdırmanın kolay bir yolu var mı ?

Bunu yapmak için bir for döngüsü yazmak oldukça kolaydır, ancak pek şık değil .... eğer mantıklıysa.

Yanıtlar:


150

Sadece şunu kullanın join():

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

9
Veya, gerçekten kirli olmasını istiyorsanız: {local $,=', ';print @array}.
musiKk

10
Bunu yapmanın birden fazla yolu vardır .. ama bu, sizden nefret ettikten sonra kişinin kodu korumasını sağlamaz. Evet, perldoc perlvar var, ancak tüm ezoterik değişkenlerin ne yaptığını anlamak için perlvar'ı diğer satırlara vurmaktansa "join", "@array" üzerine bakmayı tercih ederim.
Oesor

@Oesor: Bu yüzden ona kirli dedim. Ama diğer cevaplara bakarsak, gerçekten en kötü suçlu ben değilim. :)
musiKk

@musiKK Beğendim! İş arkadaşlarımı şaşırtmak istersem kullanacağım bir şey. :)
Alex

3
Bu, dizin içeriğini yazdırmak için gerçekten güzel çalıştı. print "current directory contains " . join(', ', <*>) . "\n";
Randall


18

Perl ile yeni başlayan birinin anlayacağı türden bir netlik kodluyorsanız, geleneksel bu yapı ne anlama geldiğini yüksek derecede netlik ve okunaklılıkla söyler:

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

Bu yapı içinde belgelenmiştir perldoc -fjoin.

Ancak, bunu ne kadar basitleştirdiğini her zaman sevmişimdir $,. Özel değişken $"enterpolasyon içindir ve özel değişken $,listeler içindir. localKomut dosyası boyunca dalgalanma efektlerinden kaçınmak için ikisinden birini dinamik kapsam kısıtlama ile birleştirin ' ':

use 5.012_002;
use strict;
use warnings;

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

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

VEYA $ ile ,:

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

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

Özel değişkenler $,ve perlvar$" olarak belgelenmiştir . Anahtar kelime ve küresel bir noktalama değişkenin değerini değiştirerek etkilerini sınırlamak için nasıl kullanılabileceğini muhtemelen en iyi açıklanan perlsub .local

Zevk almak!


10

Ayrıca Data :: Dumper'ı da denemek isteyebilirsiniz . Misal:

use Data::Dumper;

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

4
Data :: Dumper standart bir modüldür ve Perl ile birlikte kurulur. Tüm standart pragmatiklerin ve modüllerin bir listesini almak için bkz pelrdoc perlmodlib.
shawnhcorey

7

İnceleme / hata ayıklama için Data::Printermodülü kontrol edin . Yalnızca bir şeyi ve tek bir şeyi yapmak içindir:

Perl değişkenlerini ve nesnelerini ekranda uygun şekilde biçimlendirilmiş olarak görüntüleyin (bir insan tarafından incelenecek)

Örnek kullanım:

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

Yukarıdaki kod şuna benzer bir çıktı verebilir (renklerle!):

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

Ubuntu altında libdata-printer-perlpaketi kurabilirsiniz .
planetp

3

Basitçe yapabilirsiniz print.

@a = qw(abc def hij);

print "@a";

Alacaksın:

abc def hij

1
Baskıda virgül var çünkü bunlar dizinin her bir öğesinde yer alıyor. Gerçekten beyan etmeli use warnings;ve ne yazdığını görmelisiniz.
Toto

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

use JSON::XS;
print encode_json \@some_array

1

Kullanarak 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)]);

Üç farklı çıktı stili üretir:

$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

Aradığınız şey bu olmayabilir, ancak işte bir görev için yaptığım bir şey:

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

0

Harita da kullanılabilir, ancak bazen çok fazla işiniz varken okumak zordur.

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

0

Yine de aşağıda koşmayı denemedim. Bunun zor bir yol olduğunu düşünüyorum.

map{print $_;} @array;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.