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.

Respostas:


149

Basta usar join():

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

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


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!


10

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

use Data::Dumper;

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

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

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

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

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

1

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

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

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; 

0

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

map{print $_;} @array;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.