Łatwy sposób na wydrukowanie tablicy Perl? (z niewielkim formatowaniem)

97

Czy istnieje łatwy sposób na wydrukowanie tablicy Perla z przecinkami między każdym elementem?

Napisanie pętli for jest dość łatwe, ale niezbyt eleganckie ... jeśli to ma sens.

funk-shun
źródło

Odpowiedzi:

150

Po prostu użyj join():

# assuming @array is your array:
print join(", ", @array);
Alex
źródło
9
Albo, jeśli chcesz być naprawdę brudne: {local $,=', ';print @array}.
musiKk
10
Jest więcej niż jeden sposób, aby to zrobić… ale jest to sposób, który nie sprawia, że ​​osoba utrzymująca kod po tym, jak Cię nienawidzisz. Tak, perldoc perlvar istnieje, ale wolałbym rzucić okiem na „join”, „@array” niż uderzać perlvar w co drugą linię, aby dowiedzieć się, co robią wszystkie ezoteryczne zmienne.
Oesor,
@Oesor: Dlatego nazwałem to brudnym. Ale cóż, patrząc na inne odpowiedzi, nie jestem najgorszym przestępcą. :)
musiKk
@musiKK Podoba mi się! To coś, czego bym użył, gdybym chciał zagadać moich współpracowników. :)
Alex
3
Działało to naprawdę dobrze przy drukowaniu zawartości katalogu. print "current directory contains " . join(', ', <*>) . "\n";
Randall
31

Możesz użyć Data::Dump:

use Data::Dump qw(dump);
my @a = (1, [2, 3], {4 => 5});
dump(@a);

Produkuje:

"(1, [2, 3], { 4 => 5 })"
Eugene Yarmash
źródło
2
W systemie Ubuntu / Mint zainstaluj pakiet libdata-dump-perl.
MUY Belgium
2
Najlepsza odpowiedź tutaj! Działa również z tablicami wielowymiarowymi. Najbardziej elastyczny.
Léo Léopold Hertz 준영
18

Jeśli programujesz pod kątem przejrzystości, która byłaby zrozumiała dla kogoś, kto dopiero zaczyna z Perlem, tradycyjny ten konstrukt mówi, co to znaczy, z wysokim stopniem jasności i czytelności:

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

Ta konstrukcja jest udokumentowana w perldoc -fjoin.

Jednak zawsze podobało mi się, jak proste $,to robi. Zmienna specjalna $"służy do interpolacji, a zmienna specjalna $,do list. Połącz jedną z nich z dynamicznym ograniczaniem zakresu ' local', aby uniknąć efektów falowania w całym skrypcie:

use 5.012_002;
use strict;
use warnings;

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

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

LUB z $ ,:

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

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

Zmienne specjalne $,i $"są udokumentowane w perlvar . localSłów kluczowych, i jak to może być wykorzystane do ograniczenia skutków zmiany wartości zmiennej globalnej interpunkcyjny jest prawdopodobnie najlepiej opisany w perlsub .

Cieszyć się!

David O
źródło
10

Możesz także wypróbować Data :: Dumper . Przykład:

use Data::Dumper;

# simple procedural interface
print Dumper($foo, $bar);
Andreas
źródło
4
Data :: Dumper to standardowy moduł instalowany wraz z Perlem. Aby uzyskać listę wszystkich standardowych pragmatyków i modułów, zobacz pelrdoc perlmodlib.
shawnhcorey
7

W celu sprawdzenia / debugowania sprawdź Data::Printermoduł. Ma na celu zrobienie jednej rzeczy i tylko jednej rzeczy:

wyświetlać zmienne i obiekty Perla na ekranie, odpowiednio sformatowane (do sprawdzenia przez człowieka)

Przykładowe użycie:

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

Powyższy kod może wyświetlić coś takiego (z kolorami!):

   [
       [0] "a",
       [1] "b",
       [2] undef,
       [3] "c",
   ]
Eugene Yarmash
źródło
W Ubuntu można zainstalować libdata-printer-perlpakiet.
planetp
3

Możesz to po prostu print.

@a = qw(abc def hij);

print "@a";

Otrzymasz:

abc def hij
Yi Zhao
źródło
1
Masz przecinki na wydruku, ponieważ znajdują się one w każdym elemencie tablicy. Naprawdę powinieneś zadeklarować use warnings;i zobaczyć, co mówi.
Toto
2
# better than Dumper --you're ready for the WWW....

use JSON::XS;
print encode_json \@some_array
gleeco
źródło
1

Używając 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)]);

Generuje trzy różne style wyjściowe:

$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'
          ];
TVNshack
źródło
1

To może nie być to, czego szukasz, ale oto coś, co zrobiłem dla zadania:

$" = ", ";
print "@ArrayName\n";
009
źródło
0

Mapa może być również używana, ale czasami jest trudna do odczytania, gdy dzieje się dużo rzeczy.

map{ print "element $_\n" }   @array; 
PodTech.io
źródło
0

Jednak nie próbowałem biec poniżej. Myślę, że to trudny sposób.

map{print $_;} @array;
K.Minoda
źródło