¿Una forma sencilla de imprimir una matriz Perl? (con un poco de formato)

96

¿Existe una manera fácil de imprimir una matriz Perl con comas entre cada elemento?

Escribir un bucle for para hacerlo es bastante fácil pero no del todo elegante ... si eso tiene sentido.

funk-shun
fuente

Respuestas:

149

Solo usa join():

# assuming @array is your array:
print join(", ", @array);
Alex
fuente
9
O, si quieres ser realmente sucio: {local $,=', ';print @array}.
musiKk
10
Hay más de una forma de hacerlo ... pero esta es la forma que no hace que la persona que mantiene el código después de que usted lo odie. Sí, perldoc perlvar existe, pero prefiero echar un vistazo a "join", "@array" que presionar perlvar cada dos líneas para averiguar qué están haciendo todas las variables esotéricas.
Oesor
@Oesor: Por eso lo llamé sucio. Pero bueno, mirando las otras respuestas, no soy realmente el peor infractor. :)
musiKk
@musiKK ¡Me gusta! Es algo que usaría si quisiera desconcertar a mis compañeros de trabajo. :)
Alex
3
Esto funcionó muy bien para imprimir el contenido del directorio. print "current directory contains " . join(', ', <*>) . "\n";
Randall
31

Puede utilizar Data::Dump:

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

Produce:

"(1, [2, 3], { 4 => 5 })"
Eugene Yarmash
fuente
2
En Ubuntu / Mint, instale el paquete libdata-dump-perl.
MUY Bélgica
2
¡La mejor respuesta aquí! También funciona con matrices multidimensionales. Más flexible.
Léo Léopold Hertz 준영
18

Si está codificando para el tipo de claridad que entendería alguien que recién comienza con Perl, la construcción tradicional de este dice lo que significa, con un alto grado de claridad y legibilidad:

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

Esta construcción está documentada en perldoc -fjoin.

Sin embargo, siempre me ha gustado lo simple $,que lo hace. La variable especial $"es para interpolación y la variable especial $,es para listas. Combine cualquiera de los dos con restricción dinámica de alcance ' local' para evitar efectos en cadena en todo el 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
}

Las variables especiales $,y $"están documentadas en perlvar . La localpalabra clave, y cómo se puede usar para restringir los efectos de alterar el valor de una variable de puntuación global, probablemente se describa mejor en perlsub .

¡Disfrutar!

DavidO
fuente
10

Además, es posible que desee probar Data :: Dumper . Ejemplo:

use Data::Dumper;

# simple procedural interface
print Dumper($foo, $bar);
Andreas
fuente
4
Data :: Dumper es un módulo estándar y se instala junto con Perl. Para obtener una lista de todos los módulos y pragmática estándar, consulte pelrdoc perlmodlib.
shawnhcorey
7

Para inspección / depuración, verifique el Data::Printermódulo. Está destinado a hacer una cosa y solo una cosa:

mostrar variables y objetos de Perl en la pantalla, correctamente formateados (para ser inspeccionados por un humano)

Uso de ejemplo:

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

El código anterior podría generar algo como esto (¡con colores!):

   [
       [0] "a",
       [1] "b",
       [2] undef,
       [3] "c",
   ]
Eugene Yarmash
fuente
En Ubuntu se puede instalar el libdata-printer-perlpaquete.
planetp
3

Puede simplemente printhacerlo.

@a = qw(abc def hij);

print "@a";

Tendrás:

abc def hij
Yi Zhao
fuente
1
Tiene comas en la letra impresa porque están en cada elemento de la matriz. Realmente deberías declarar use warnings;y ver lo que dice.
Toto
2
# better than Dumper --you're ready for the WWW....

use JSON::XS;
print encode_json \@some_array
gleeco
fuente
1

Usando 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 tres estilos de salida diferentes:

$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
fuente
1

Puede que esto no sea lo que estás buscando, pero aquí hay algo que hice para una tarea:

$" = ", ";
print "@ArrayName\n";
009
fuente
0

También se puede utilizar el mapa, pero a veces es difícil de leer cuando hay muchas cosas en marcha.

map{ print "element $_\n" }   @array; 
PodTech.io
fuente
0

Sin embargo, no he intentado correr abajo. Creo que esta es una forma complicada.

map{print $_;} @array;
K.Minoda
fuente