Risposte:
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
};
&operatore in C e C ++. La ragione per cui è importante in questo contesto è che in Perl, se si chiama una funzione con un valore hash come argomento, quel valore hash viene elencato ed espanso in più argomenti - quindi %hsh=("a" => 1, "b" => 2); foo(%hsh);sarebbe equivalente a foo("a", 1, "b", 2). Se invece desidera che la funzione di operare sul hash per sé, è necessario passare un riferimento alla hash: foo(\%hsh);See perldoc.perl.org/perlsub.html#Pass-by-Reference
Facile:
print "$_ $h{$_}\n" for (keys %h);
Elegante, ma in realtà più lento del 30% (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);, $knon esiste in questo esempio.
forciclo è più veloce di whilealmeno 10.000 tasti: gist.github.com/151792
Ecco come è possibile stampare senza usare Data::Dumper
print "@{[%hash]}";
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 quante più variabili per ottenere l'output in un formato piacevole di quello che si fa Data::Dumper.
use Data::Dump = 'dump';
print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
Più recentemente ho usato Data::Printerper 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 è 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"
}
}
=>che ti aspetti. Invece stampa sempre la chiave, diversi spazi e quindi il valore. Ciò aiuta una scansione umana sull'output.
La risposta dipende da cosa c'è nel tuo hash. Se hai un hash semplice, un 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. Questa camminata dei riferimenti è normalmente chiamata serializzazione. Esistono molti moduli che implementano stili diversi, alcuni dei più popolari sono:
A causa del fatto che Data::Dumperfa parte della libreria Perl di base, è probabilmente la più popolare; tuttavia, alcuni degli altri moduli hanno cose molto buone da offrire.
use Smart::Comments, lo vedo anche da quella prospettiva. Ma per il contatore, Smart::Commentssi comporta abbastanza bene come un modulo con ambito , non dovrebbe esserci un comportamento di output in nessun modulo che non usi anche SC. Quindi, il problema sarebbe isolato a quegli ambiti con un'istruzione use . Se stai dicendo che un programmatore di manutenzione non ha alcuna responsabilità di leggere il documento sui moduli inclusi, non posso essere d'accordo. Comunque, grazie per il commento
looping:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
Funzionale
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Ma per pura eleganza, dovrei scegliere quello di Wrang Wrang. Per il mio codice, sceglierei la mia foreach. O l'uso di Detro di Tetro.
foreache map. mapdovrebbe essere usato per le trasformazioni dell'elenco, non in un contesto vuoto per emulare un for-loop
Il modo più semplice nelle mie esperienze è usare solo Dumpvalue .
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
Funziona come un incantesimo e non devi preoccuparti di formattare l'hash, in quanto lo emette come fa il debugger Perl (ottimo per il debug). Inoltre, Dumpvalue è incluso nel set di moduli Perl, quindi non devi fare confusione con CPAN se sei dietro un qualche tipo di proxy draconiano (come se fossi al lavoro).
Se vuoi essere pedante e mantenerlo su una riga (senza dichiarazioni d'uso e shebang), allora mi sposterò un po 'sulla risposta del tetromino e suggerirò:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Non fare nulla di speciale oltre all'utilizzo dell'hash anonimo per saltare la variabile temp;)