Continuo imprimindo meu hash como # de baldes / # alocados. Como imprimo o conteúdo do meu hash?
Sem o uso de um while
loop seria o mais preferível (por exemplo, um one-liner seria o melhor).
Data :: Dumper é seu amigo.
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
irá produzir
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
operador em C e C ++. A razão pela qual isso importa nesse contexto é que, em Perl, se você chamar uma função com um valor de hash como argumento, esse valor de hash será listado e expandido em vários argumentos - portanto,%hsh=("a" => 1, "b" => 2); foo(%hsh);
seria equivalente afoo("a", 1, "b", 2)
. Se você em vez disso quer a função de operar no próprio haxixe, você precisa passar uma referência para o hash:foo(\%hsh);
Veja perldoc.perl.org/perlsub.html#Pass-by-ReferenceFácil:
Elegante, mas na verdade 30% mais lento (!):
fonte
print "$_ $h{$_}\n" for (keys %h);
,$k
não existe nesse exemplo.for
loop é mais rápido que aswhile
até 10.000 chaves: gist.github.com/151792Aqui, como você pode imprimir sem usar
Data::Dumper
fonte
Para fins de depuração, usarei frequentemente
YAML
.Resulta em:
Outras vezes eu usarei
Data::Dump
. Você não precisa definir tantas variáveis para que ele a produza em um formato agradável do que o necessárioData::Dumper
.Mais recentemente, tenho usado
Data::Printer
para depuração.(O resultado pode ser muito mais colorido em um terminal)
Ao contrário dos outros exemplos que mostrei aqui, este foi projetado explicitamente para ser apenas para fins de exibição. O que aparece mais facilmente se você despejar a estrutura de uma variável vinculada ou a de um objeto.
fonte
=>
esperada. Em vez disso, sempre imprime a chave, vários espaços e, em seguida, o valor. O que ajuda uma varredura humana sobre a saída.A resposta depende do que está no seu hash. Se você tem um hash simples, um simples
ou
funcionará, mas se você tiver um hash preenchido com referências, terá algo que poderá percorrer essas referências e produzir uma saída sensata. Essa caminhada das referências é normalmente chamada de serialização. Existem muitos módulos que implementam estilos diferentes, alguns dos mais populares são:
Data::Dumper
Data::Dump::Streamer
YAML::XS
JSON::XS
XML::Dumper
Devido ao fato de fazer
Data::Dumper
parte da biblioteca principal do Perl, é provavelmente o mais popular; no entanto, alguns dos outros módulos têm coisas muito boas a oferecer.fonte
Meu favorito: Smart :: Comentários
É isso aí.
fonte
use
Smart::Comments
vejo isso também. Mas, para o contador,Smart::Comments
é muito bem comportado como um módulo com escopo , não deve haver comportamento de saída em nenhum módulo que também não use o SC. Portanto, o problema seria isolado para esses escopos com uma declaração de uso . Se você está dizendo que um programador de manutenção não tem responsabilidade de ler o documento nos módulos incluídos, não posso concordar. Ainda assim, obrigado por comentarLooping:
Funcional
Mas, por pura elegância, eu teria que escolher o wrang-wrang. Para o meu próprio código, eu escolheria meu foreach. Ou o uso de Dumper da tetro.
fonte
foreach
emap
.map
deve ser usado para a lista de transformações, não no contexto vazio para emular um loop forA maneira mais fácil em minhas experiências é apenas usar o Dumpvalue .
Funciona como um encanto e você não precisa se preocupar em formatar o hash, pois ele o gera como o depurador Perl (ótimo para depuração). Além disso, o Dumpvalue está incluído no conjunto de módulos Perl, para que você não precise mexer no CPAN se estiver atrás de algum tipo de proxy draconiano (como eu estou no trabalho).
fonte
Se você quer ser pedante e mantê-lo em uma linha (sem as instruções de uso e o shebang), então eu meio que recuo da resposta do tetromino e sugiro:
Não fazer nada de especial além de usar o hash anônimo para pular a variável temp;)
fonte
Anexo um espaço para cada elemento do hash para vê-lo bem:
fonte
Eu realmente gosto de classificar as chaves em um código de linha:
fonte