¿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.

Respuestas:


149

Solo usa join():

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

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


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!


10

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

use Data::Dumper;

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

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",
   ]

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

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

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'
          ];

1

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

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

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; 

0

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

map{print $_;} @array;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.