Un modo semplice per stampare array Perl? (con un po 'di formattazione)


97

C'è un modo semplice per stampare un array Perl con virgole tra ogni elemento?

Scrivere un ciclo for per farlo è abbastanza facile ma non del tutto elegante ... se ha senso.

Risposte:


150

Usa solo join():

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

9
O, se si vuole essere davvero sporco: {local $,=', ';print @array}.
musiKk

10
C'è più di un modo per farlo ... ma questo è il modo in cui la persona non mantiene il codice dopo che ti odia. Sì, perldoc perlvar esiste, ma preferisco dare un'occhiata a "join", '@array "piuttosto che premere perlvar ogni due righe per capire cosa stanno facendo tutte le variabili esoteriche.
Oesor

@ Esor: Ecco perché l'ho chiamato sporco. Ma beh, guardando le altre risposte, non sono davvero il peggior trasgressore. :)
musiKk

@musiKK mi piace! È qualcosa che userei se volessi sconcertare i miei colleghi di lavoro. :)
Alex

3
Questo ha funzionato davvero bene per la stampa del contenuto della directory. print "current directory contains " . join(', ', <*>) . "\n";
Randall


18

Se stai codificando per il tipo di chiarezza che sarebbe compreso da qualcuno che ha appena iniziato con Perl, il tradizionale questo costrutto dice cosa significa, con un alto grado di chiarezza e leggibilità:

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

Questo costrutto è documentato in perldoc -fjoin.

Tuttavia, mi è sempre piaciuto quanto sia semplice $,. La variabile speciale $"è per l'interpolazione e la variabile speciale $,è per gli elenchi. Combina uno dei due con il vincolo dinamico dell'ambito " local" per evitare effetti a catena in tutto lo script:

use 5.012_002;
use strict;
use warnings;

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

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

O con $ ,:

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

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

Le variabili speciali $,e $"sono documentate in perlvar . La localparola chiave e il modo in cui può essere utilizzata per limitare gli effetti dell'alterazione del valore di una variabile di punteggiatura globale è probabilmente meglio descritta in perlsub .

Godere!


10

Inoltre, potresti provare Data :: Dumper . Esempio:

use Data::Dumper;

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

4
Data :: Dumper è un modulo standard e viene installato insieme a Perl. Per ottenere un elenco di tutti i moduli e pragmatici standard, vedere pelrdoc perlmodlib.
shawnhcorey

7

Per l'ispezione / debug controllare il Data::Printermodulo. Ha lo scopo di fare una cosa e solo una cosa:

mostra variabili e oggetti Perl sullo schermo, formattati correttamente (per essere ispezionati da un essere umano)

Utilizzo di esempio:

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

Il codice sopra potrebbe produrre qualcosa di simile (con i colori!):

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

Sotto Ubuntu si può installare il libdata-printer-perlpacchetto.
planetp

3

Puoi semplicemente printfarlo.

@a = qw(abc def hij);

print "@a";

Avrai:

abc def hij

1
Hai virgole nella stampa perché sono in ogni elemento della matrice. Dovresti davvero dichiarare use warnings;e vedere cosa dice.
Toto

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

use JSON::XS;
print encode_json \@some_array

1

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

Genera tre diversi stili di output:

$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

Questo potrebbe non essere quello che stai cercando, ma ecco qualcosa che ho fatto per un incarico:

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

0

Puoi anche usare la mappa, ma a volte è difficile da leggere quando hai molte cose da fare.

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

0

Tuttavia, non ho provato a correre di sotto. Penso che questo sia un modo complicato.

map{print $_;} @array;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.