it-swarm.dev

Come posso stampare il contenuto di un hash in Perl?

Continuo a stampare il mio hash come # di bucket/# assegnati. Come posso stampare il contenuto del mio hash?

Senza usare un ciclo while sarebbe preferibile (per esempio, un one-liner sarebbe il migliore).

150
Kys

Data :: Dumper è tuo amico.

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

uscirà

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

Facile:

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

Elegante, ma in realtà il 30% più lento (!):

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

Ecco come stampare senza usare Data::Dumper

print "@{[%hash]}";
33
user966588

Per scopi di debug userò spesso YAML .

use strict;
use warnings;

use YAML;

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

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

Risultati in:

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

Altre volte userò Data::Dump . Non è necessario impostare il numero di variabili per ottenere l'output in un formato Nice rispetto a quello per Data::Dumper .

use Data::Dump = 'dump';

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

Più di recente ho usato Data::Printer per il debug.

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

(Il risultato può essere molto più colorato su un terminale)

A differenza degli altri esempi che ho mostrato qui, questo è stato progettato esplicitamente per essere solo a scopo di visualizzazione. Che si presenta più facilmente se scarichi la struttura di una variabile legata o quella di un oggetto.

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"
    }
}
21
Brad Gilbert

La risposta dipende da cosa c'è nel tuo hash. Se hai un hash semplice e semplice

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

o

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

lo farà, ma se hai un hash che è popolato di riferimenti, avrai qualcosa che può camminare su quei riferimenti e produrre un risultato sensato. Questo cammino dei riferimenti è normalmente chiamato serializzazione. Esistono molti moduli che implementano stili diversi, alcuni dei più popolari sono:

Dato che Data::Dumper fa parte della libreria Perl core, è probabilmente il più popolare; tuttavia, alcuni degli altri moduli hanno cose molto buone da offrire.

11
Chas. Owens

Il mio preferito: Smart :: Commenti

use Smart::Comments;
# ...

### %hash

Questo è tutto.

10
Axeman

Looping:

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

Funzionale

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

Ma per pura eleganza, dovrei scegliere il wrang-wrang. Per il mio codice, sceglierei il mio foreach. Oppure usare Dumper di Tetro.

4
Paul Nathan

Il modo più semplice nelle mie esperienze è usare semplicemente Dumpvalue .

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

Funziona come un incantesimo e non ti devi preoccupare di formattare l'hash, poiché lo fa uscire come fa il debugger Perl (ottimo per il debug). Inoltre, Dumpvalue è incluso nel set di titoli dei moduli Perl, quindi non devi fare confusione con CPAN se sei dietro a qualche tipo di proxy draconiano (come se fossi al lavoro).

2
Weegee

Appendo uno spazio per ogni elemento dell'hash per vederlo bene:

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

Se vuoi essere pedante e tenerlo su una riga (senza usare le istruzioni e Shebang), allora tornerò un po 'indietro dalla risposta del tetromino e suggerirò:

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

Non fare nulla di speciale se non usare l'hash anonimo per saltare la variabile temp;)

1
Kyle Walsh

Mi piace molto ordinare i tasti in un codice di copertina:

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