Maneira fácil de imprimir array Perl? (com um pouco de formatação)

96

Existe uma maneira fácil de imprimir um array Perl com vírgulas entre cada elemento?

Escrever um loop for para fazer isso é muito fácil, mas não muito elegante ... se isso faz sentido.

funk-shun
fonte

Respostas:

149

Basta usar join():

# assuming @array is your array:
print join(", ", @array);
Alex
fonte
9
Ou, se você quiser ser realmente sujo: {local $,=', ';print @array}.
musiKk de
10
Há mais de uma maneira de fazer isso ... mas essa é a maneira que não faz com que a pessoa que mantém o código depois de você odiar você. Sim, perldoc perlvar existe, mas prefiro dar uma olhada em "join ',' @array" do que acessar perlvar todas as outras linhas para descobrir o que todas as variáveis ​​esotéricas estão fazendo.
Oesor
@Oesor: É por isso que chamei de sujo. Mas bem, olhando para as outras respostas, não sou realmente o pior ofensor. :)
musiKk
@musiKK eu gosto! É algo que eu usaria se quisesse confundir meus colegas de trabalho. :)
Alex
3
Isso funcionou muito bem para imprimir o conteúdo do diretório. print "current directory contains " . join(', ', <*>) . "\n";
Randall
31

Você pode usar Data::Dump:

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

Produz:

"(1, [2, 3], { 4 => 5 })"
Eugene Yarmash
fonte
2
No Ubuntu / Mint, instale o pacote libdata-dump-perl.
MUY Bélgica
2
Melhor resposta aqui! Também funciona com arrays multidimensionais. Mais flexível.
Léo Léopold Hertz 준영
18

Se você está codificando para o tipo de clareza que seria compreendido por alguém que está apenas começando com Perl, o tradicional este construto diz o que significa, com um alto grau de clareza e legibilidade:

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

Esta construção está documentada em perldoc -fjoin.

No entanto, sempre gostei de como o $,torna simples . A variável especial $"é para interpolação e a variável especial $,é para listas. Combine qualquer um com a restrição de escopo dinâmica ' local' para evitar efeitos cascata em todo o script:

use 5.012_002;
use strict;
use warnings;

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

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

OU com $ ,:

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

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

As variáveis ​​especiais $,e $"são documentadas em perlvar . A localpalavra-chave e como ela pode ser usada para restringir os efeitos da alteração do valor de uma variável de pontuação global é provavelmente melhor descrita em perlsub .

Aproveitar!

DavidO
fonte
10

Além disso, você pode querer experimentar o Data :: Dumper . Exemplo:

use Data::Dumper;

# simple procedural interface
print Dumper($foo, $bar);
Andreas
fonte
4
Data :: Dumper é um módulo padrão e é instalado junto com o Perl. Para obter uma lista de todos os módulos e pragmáticos padrão, consulte pelrdoc perlmodlib.
shawnhcorey de
7

Para inspeção / depuração, verifique o Data::Printermódulo. Destina-se a fazer uma coisa e apenas uma coisa:

exibir variáveis ​​Perl e objetos na tela, devidamente formatados (para serem inspecionados por um humano)

Exemplo de uso:

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

O código acima pode gerar algo assim (com cores!):

   [
       [0] "a",
       [1] "b",
       [2] undef,
       [3] "c",
   ]
Eugene Yarmash
fonte
No Ubuntu, pode-se instalar o libdata-printer-perlpacote.
planetp
3

Você pode simplesmente printisso.

@a = qw(abc def hij);

print "@a";

Você terá:

abc def hij
Yi Zhao
fonte
1
Você tem vírgulas na impressão porque elas estão em cada elemento da matriz. Você realmente deve declarar use warnings;e ver o que diz.
Toto
2
# better than Dumper --you're ready for the WWW....

use JSON::XS;
print encode_json \@some_array
gleeco
fonte
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)]);

Gera três estilos de saída 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
fonte
1

Pode não ser o que você está procurando, mas aqui está algo que fiz para uma tarefa:

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

O mapa também pode ser usado, mas às vezes é difícil de ler quando há muitas coisas acontecendo.

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

Não tentei correr para baixo, no entanto. Acho que é uma maneira complicada.

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