web-dev-qa-db-fra.com

Comment puis-je imprimer le contenu d'un hachage dans Perl?

Je continue à imprimer mon hachage avec le nombre de seaux/# alloués. Comment imprimer le contenu de mon hachage?

Sans utiliser une boucle while serait préférable (par exemple, un ne ligne serait préférable).

155
Kys

Data :: Dumper est votre ami.

use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);

va sortir

$VAR1 = {
          'def' => [
                     4,
                     5,
                     6
                   ],
          'abc' => 123
        };
235
tetromino

Facile:

print "$_ $h{$_}\n" for (keys %h);

Élégant, mais en réalité 30% plus lent (!):

while (my ($k,$v)=each %h){print "$k $v\n"}
58
Jonathan Graehl

Voici comment vous pouvez imprimer sans utiliser Data::Dumper

_print "@{[%hash]}";
_
35
user966588

Pour les besoins du débogage, je vais souvent utiliser YAML .

_use strict;
use warnings;

use YAML;

my %variable = ('abc' => 123, 'def' => [4,5,6]);

print "# %variable\n", Dump \%variable;
_

Résulte en:

_# %variable
---
abc: 123
def:
  - 4
  - 5
  - 6
_

D'autres fois, je vais utiliser Data::Dump . Vous n'avez pas besoin de définir autant de variables pour obtenir le résultat dans un format de Nice que pour Data::Dumper .

_use Data::Dump = 'dump';

print dump(\%variable), "\n";
_
_{ abc => 123, def => [4, 5, 6] }
_

Plus récemment, j'ai utilisé Data::Printer pour le débogage.

_use Data::Printer;
p %variable;
_
_{
    abc   123,
    def   [
        [0] 4,
        [1] 5,
        [2] 6
    ]
}
_

(Le résultat peut être beaucoup plus coloré sur un terminal)

Contrairement aux autres exemples que j'ai montrés ici, celui-ci est conçu explicitement pour être affiché uniquement. Ce qui apparaît plus facilement si vous extrayez la structure d'une variable liée ou celle d'un objet.

_use strict;
use warnings;

use MTie::Hash;
use Data::Printer;

my $h = tie my %h, "Tie::StdHash";
@h{'a'..'d'}='A'..'D';
p %h;
print "\n";
p $h;
_
_{
    a   "A",
    b   "B",
    c   "C",
    d   "D"
} (tied to Tie::StdHash)

Tie::StdHash  {
    public methods (9) : CLEAR, DELETE, EXISTS, FETCH, FIRSTKEY, NEXTKEY, SCALAR, STORE, TIEHASH
    private methods (0)
    internals: {
        a   "A",
        b   "B",
        c   "C",
        d   "D"
    }
}
_
22
Brad Gilbert

La réponse dépend de ce qu'il y a dans votre hash. Si vous avez un hachage simple

_print map { "$_ $h{$_}\n" } keys %h;
_

ou

_print "$_ $h{$_}\n" for keys %h;
_

fera, mais si vous avez un hachage qui est rempli avec des références vous pourrez quelque chose qui peut marcher sur ces références et produire un résultat raisonnable. Cette marche des références est normalement appelée sérialisation. Il existe de nombreux modules qui implémentent différents styles, les plus populaires étant:

Étant donné que _Data::Dumper_ fait partie de la bibliothèque Perl principale, c'est probablement la plus populaire. Cependant, certains des autres modules ont de très bonnes choses à offrir.

11
Chas. Owens

Mon préféré: Smart :: Comments

use Smart::Comments;
# ...

### %hash

C'est ça.

10
Axeman

En boucle:

foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }

Fonctionnel

map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;

Mais pour une grande élégance, je devrais choisir le wrang-wrang's. Pour mon propre code, je choisirais mon foreach. Ou l'utilisation de Dumper de tetro.

4
Paul Nathan

Le moyen le plus simple dans mes expériences est simplement d'utiliser Dumpvalue .

use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);

Fonctionne comme un charme et vous n'avez pas à vous soucier de la mise en forme du hachage, car il le sort comme le débogueur Perl (idéal pour le débogage). De plus, Dumpvalue est inclus dans le stock de modules Perl, de sorte que vous n’aurez pas à vous soucier de CPAN si vous êtes derrière une sorte de proxy draconien (comme je suis au travail).

2
Weegee

J'ajoute un espace pour que chaque élément du hash puisse bien le voir:

print map {$_ . " "} %h, "\n";
1
carlos_lm

Si vous voulez être pédant et garder le fil sur une ligne (sans les déclarations d'utilisation et Shebang), alors je vais en quelque sorte revenir en arrière de la réponse de tetromino et suggérer:

print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );

Ne rien faire de spécial autre que d'utiliser le hash anonyme pour sauter la variable temp;)

1
Kyle Walsh

J'aime vraiment trier les clés dans un code de support:

print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);
1
labist