Antworten:
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
};
&
Operator in C und C ++. Der Grund, warum dies in diesem Zusammenhang wichtig ist, ist, dass in Perl, wenn Sie eine Funktion mit einem Hash-Wert als Argument aufrufen, dieser Hash-Wert aufgelistet und in mehrere Argumente erweitert wird - dies %hsh=("a" => 1, "b" => 2); foo(%hsh);
entspricht alsofoo("a", 1, "b", 2)
. Wenn Sie stattdessen die Funktion für den Betrieb auf dem Hash wollen selbst, müssen Sie einen Verweis auf die Hash weitergeben müssen: foo(\%hsh);
Siehe perldoc.perl.org/perlsub.html#Pass-by-Reference
Einfach:
print "$_ $h{$_}\n" for (keys %h);
Elegant, aber tatsächlich 30% langsamer (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
, $k
existiert in diesem Beispiel nicht.
for
Schleife ist schneller als die while
bis zu mindestens 10.000 Schlüssel: gist.github.com/151792
Hier erfahren Sie, wie Sie ohne Verwendung drucken können Data::Dumper
print "@{[%hash]}";
Zum Debuggen werde ich oft verwenden 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 werde ich verwenden Data::Dump
. Sie müssen nicht so viele Variablen festlegen, damit es in einem schönen Format ausgegeben wird, als Sie es tun 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 verwendet.
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, dient dieses Beispiel explizit nur zur Anzeige. Dies wird leichter angezeigt, 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"
}
}
=>
wie erwartet ausgibt . Stattdessen wird immer der Schlüssel, mehrere Leerzeichen und dann der Wert gedruckt. Dies hilft einem Menschen, die Ausgabe zu scannen.
Die Antwort hängt davon ab, was in Ihrem Hash enthalten ist. Wenn Sie einen einfachen Hash haben, einen einfachen
print map { "$_ $h{$_}\n" } keys %h;
oder
print "$_ $h{$_}\n" for keys %h;
wird tun, aber wenn Sie einen Hash haben, der mit Referenzen gefüllt ist, werden Sie etwas, das diese Referenzen durchlaufen und eine vernünftige Ausgabe erzeugen kann. Dieses Durchlaufen der Referenzen wird normalerweise als Serialisierung bezeichnet. Es gibt viele Module, die unterschiedliche Stile implementieren. Einige der beliebtesten sind:
Aufgrund der Tatsache, dass Data::Dumper
es Teil der Perl-Kernbibliothek ist, ist es wahrscheinlich die beliebteste. Einige der anderen Module haben jedoch sehr gute Dinge zu bieten.
use
Smart::Comments
, sehe ich es auch aus dieser Perspektive. Aber an die Theke, Smart::Comments
ist ziemlich gut als artig scoped Modul, sollte es nicht Ausgabeverhalten in jedem Modul sein , das nicht auch nicht verwenden SC. Das Problem würde also mit einer use- Anweisung auf diese Bereiche beschränkt . Wenn Sie sagen, dass ein Wartungsprogrammierer nicht dafür verantwortlich ist, das Dokument zu den enthaltenen Modulen zu lesen, kann ich dem nicht zustimmen. Trotzdem, danke für den Kommentar
Looping:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
Funktionell
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
Aber für pure Eleganz müsste ich Wrang-Wrang wählen. Für meinen eigenen Code würde ich meinen foreach wählen. Oder Tetro Dumper verwenden.
foreach
und map
. map
sollte für
Nach meinen Erfahrungen ist es am einfachsten, nur 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 keine Gedanken über das Formatieren des Hashs machen, da er wie der Perl-Debugger ausgegeben wird (ideal zum Debuggen). Außerdem ist Dumpvalue im Standardsatz der Perl-Module enthalten, sodass Sie sich nicht mit CPAN herumschlagen müssen, wenn Sie sich hinter einem drakonischen Proxy befinden (wie ich bei der Arbeit bin).
Wenn Sie pedantisch sein und es in einer Zeile halten möchten (ohne Use Statements und Shebang), dann werde ich mich von Tetrominos Antwort zurückziehen und vorschlagen:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
Ich mache nichts Besonderes als den anonymen Hash, um die temporäre Variable zu überspringen;)