Un moyen facile d'imprimer un tableau Perl? (avec un peu de mise en forme)


96

Existe-t-il un moyen simple d'imprimer un tableau Perl avec des virgules entre chaque élément?

Ecrire une boucle for pour le faire est assez facile mais pas tout à fait élégant ... si cela a du sens.

Réponses:


149

Utilisez simplement join():

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

9
Ou, si vous voulez être vraiment sale: {local $,=', ';print @array}.
musiKk

10
Il y a plus d'une façon de le faire ... mais c'est de cette façon que la personne qui maintient le code après que vous vous détestez. Oui, perldoc perlvar existe, mais je préfère jeter un coup d'œil sur "join", "@array" plutôt que d'appuyer sur perlvar toutes les deux lignes pour comprendre ce que font toutes les variables ésotériques.
Oesor

@Oesor: C'est pourquoi je l'ai appelé sale. Mais bon, en regardant les autres réponses, je ne suis pas vraiment le pire délinquant. :)
musiKk

@musiKK j'aime ça! C'est quelque chose que j'utiliserais si je voulais intriguer mes collègues. :)
Alex

3
Cela fonctionnait très bien pour imprimer le contenu du répertoire. print "current directory contains " . join(', ', <*>) . "\n";
Randall

31

Vous pouvez utiliser Data::Dump:

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

Produit:

"(1, [2, 3], { 4 => 5 })"

2
Sur Ubuntu / Mint, installez le paquet libdata-dump-perl.
MUY Belgique

2
Meilleure réponse ici! Fonctionne également avec des tableaux multidimensionnels. Le plus flexible.
Léo Léopold Hertz 준영

18

Si vous codez pour le type de clarté qui serait compris par quelqu'un qui commence tout juste avec Perl, la construction traditionnelle dit ce que cela signifie, avec un degré élevé de clarté et de lisibilité:

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

Cette construction est documentée dans perldoc -fjoin.

Cependant, j'ai toujours aimé la simplicité $,. La variable spéciale $"est pour l'interpolation et la variable spéciale $,est pour les listes. Combinez l'un ou l'autre avec une contrainte de portée dynamique ' local' pour éviter d'avoir des effets d'entraînement tout au long du script:

use 5.012_002;
use strict;
use warnings;

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

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

OU avec $ ,:

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

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

Les variables spéciales $,et $"sont documentées dans perlvar . Le localmot-clé, et comment il peut être utilisé pour limiter les effets de la modification de la valeur d'une variable de ponctuation globale, est probablement mieux décrit dans perlsub .

Prendre plaisir!


10

Vous pouvez également essayer Data :: Dumper . Exemple:

use Data::Dumper;

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

4
Data :: Dumper est un module standard et est installé avec Perl. Pour obtenir une liste de toutes les pragmatiques et modules standard, voir pelrdoc perlmodlib.
shawnhcorey

7

Pour l'inspection / le débogage, vérifiez le Data::Printermodule. Il est destiné à faire une chose et une seule chose:

afficher des variables et des objets Perl à l'écran, correctement formatés (à inspecter par un humain)

Exemple d'utilisation:

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

Le code ci-dessus peut afficher quelque chose comme ceci (avec des couleurs!):

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

Sous Ubuntu, on peut installer le libdata-printer-perlpackage.
planetp

3

Vous pouvez simplement printcela.

@a = qw(abc def hij);

print "@a";

Vous aurez:

abc def hij

1
Vous avez des virgules dans l'impression car elles sont dans chaque élément du tableau. Vous devriez vraiment déclarer use warnings;et voir ce qu'il dit.
Toto

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

use JSON::XS;
print encode_json \@some_array

1

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

Génère trois styles de sortie différents:

$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

Ce n'est peut-être pas ce que vous recherchez, mais voici quelque chose que j'ai fait pour une mission:

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

0

La carte peut également être utilisée, mais parfois difficile à lire lorsque vous avez beaucoup de choses à faire.

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

0

Je n'ai pas essayé de courir ci-dessous, cependant. Je pense que c'est une manière délicate.

map{print $_;} @array;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.