it-swarm.com.de

Wie kann ich den Inhalt eines Hashes in Perl drucken?

Ich drucke meinen Hash als Anzahl der zugewiesenen Eimer/Anzahl. Wie drucke ich den Inhalt meines Hash aus?

Ohne die Verwendung einer while -Schleife wäre am besten (zum Beispiel wäre ein Einzeiler am besten).

155
Kys

Data :: Dumper ist dein Freund.

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

wird ausgegeben

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

Einfach:

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

Elegant, aber tatsächlich 30% langsamer (!):

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

Hier erfahren Sie, wie Sie drucken können, ohne Data::Dumper

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

Zum Debuggen verwende ich oft YAML .

use strict;
use warnings;

use YAML;

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

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

Ergebnisse in:

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

Andere Male verwende ich Data::Dump . Sie müssen nicht so viele Variablen festlegen, um es in einem Nizza-Format auszugeben, wie Sie für Data::Dumper .

use Data::Dump = 'dump';

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

In jüngerer Zeit habe ich Data::Printer zum Debuggen.

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

(Ergebnis kann auf einem Terminal viel bunter sein)

Im Gegensatz zu den anderen Beispielen, die ich hier gezeigt habe, ist dieses ausdrücklich nur für Anzeigezwecke vorgesehen. Was sich leichter zeigt, wenn Sie die Struktur einer gebundenen Variablen oder die eines Objekts ausgeben.

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

Die Antwort hängt davon ab, was sich in Ihrem Hash befindet. Wenn Sie einen einfachen Hash haben, einen einfachen

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

oder

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

wird es tun, aber wenn Sie einen Hash haben, der mit Referenzen gefüllt ist, werden Sie etwas finden, das diese Referenzen durchgehen und eine vernünftige Ausgabe erzeugen kann. Dieses Durchlaufen der Referenzen wird normalerweise als Serialisierung bezeichnet. Es gibt viele Module, die verschiedene Stile implementieren, einige der beliebtesten sind:

Aufgrund der Tatsache, dass Data::Dumper ist Teil der Perl-Kernbibliothek und wahrscheinlich die beliebteste. Einige der anderen Module haben jedoch sehr gute Dinge zu bieten.

11
Chas. Owens

Mein Favorit: Smart :: Comments

use Smart::Comments;
# ...

### %hash

Das ist es.

10
Axeman

Looping:

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

Funktional

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

Aber für pure Eleganz müsste ich mich für Wrang-Wrang entscheiden. Für meinen eigenen Code würde ich meinen foreach wählen. Oder Tetros Dumper verwenden.

4
Paul Nathan

Nach meinen Erfahrungen ist es am einfachsten, einfach Dumpvalue zu verwenden.

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

Funktioniert wie ein Zauber und Sie müssen sich nicht um die Formatierung des Hashs kümmern, da er wie der Perl-Debugger ausgegeben wird (ideal zum Debuggen). Außerdem ist Dumpvalue im Lieferumfang der Perl-Module enthalten, sodass Sie sich nicht mit CPAN herumschlagen müssen, wenn Sie sich hinter einem drakonischen Proxy befinden (wie ich es gerade tue).

2
Weegee

Ich füge ein Leerzeichen für jedes Element des Hashes hinzu, um es gut zu sehen:

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

Wenn Sie pedantisch sein und es auf eine Zeile beschränken möchten (ohne use-Anweisungen und Shebang), werde ich die Antwort von Tetromino sozusagen zurückschieben und vorschlagen:

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

Nichts Besonderes tun, als den anonymen Hash zum Überspringen der temporären Variablen zu verwenden;)

1
Kyle Walsh

Ich mag es wirklich, die Schlüssel in einem Code zu sortieren:

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