回答:
Data :: Dumperはあなたの友達です。
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
出力されます
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
CおよびC ++の演算子と少し似た参照を作成します。このコンテキストで重要な理由は、Perlでハッシュ値を引数として関数を呼び出すと、そのハッシュ値がリスト化されて複数の引数に展開さ%hsh=("a" => 1, "b" => 2); foo(%hsh);
れるためfoo("a", 1, "b", 2)
です。これはと同等です。あなたが代わりに関数は、ハッシュ自体を操作したい場合は、ハッシュへの参照を渡す必要がありますfoo(\%hsh);
参照してくださいperldoc.perl.org/perlsub.html#Pass-by-Reference
簡単:
print "$_ $h{$_}\n" for (keys %h);
エレガントですが、実際には30%遅くなります(!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
、$k
その例には存在しません。
for
ループはより速いですwhile
:少なくとも10,000個のキーまでgist.github.com/151792
ここでは、使用せずに印刷する方法 Data::Dumper
print "@{[%hash]}";
デバッグの目的で、私はしばしば使用しますYAML
。
use strict;
use warnings;
use YAML;
my %variable = ('abc' => 123, 'def' => [4,5,6]);
print "# %variable\n", Dump \%variable;
結果:
# %variable
---
abc: 123
def:
- 4
- 5
- 6
その他の場合は使用しますData::Dump
。の場合ほど多くの変数を設定して、適切な形式で出力する必要はありませんData::Dumper
。
use Data::Dump = 'dump';
print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
最近ではData::Printer
、デバッグに使用しています。
use Data::Printer;
p %variable;
{
abc 123,
def [
[0] 4,
[1] 5,
[2] 6
]
}
(端末では結果がはるかにカラフルになる可能性があります)
ここで示した他の例とは異なり、この例は表示のみを目的として明示的に設計されています。tieされた変数の構造またはオブジェクトの構造をダンプすると、より簡単に表示されます。
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"
}
}
=>
期待どおりに出力されていないことがわかります。代わりに、常にキー、いくつかのスペース、そして値を出力します。これは、人間による出力のスキャンに役立ちます。
答えはハッシュの内容によって異なります。単純なハッシュがある場合、単純な
print map { "$_ $h{$_}\n" } keys %h;
または
print "$_ $h{$_}\n" for keys %h;
でも、参照が入力されているハッシュがある場合、それらの参照をウォークして適切な出力を生成できるものになります。参照のこのウォーキングは通常、シリアル化と呼ばれます。さまざまなスタイルを実装する多くのモジュールがあり、より一般的なものは次のとおりです。
事実によるData::Dumper
コアPerlライブラリの一部であり、それはおそらく最も人気があります。ただし、他のモジュールのいくつかは非常に優れた機能を備えています。
use
Smart::Comments
ため、その観点からもそれを確認しています。しかし、カウンターに対してSmart::Comments
は、スコープ付きモジュールとしてかなり適切に動作し、SCを使用しないモジュールでは出力動作が発生しないはずです。したがって、問題は、useステートメントを使用してこれらのスコープに分離されます。含まれているモジュールのドキュメントをメンテナンスプログラマーが読む責任がないと言っているのであれば、私は同意できません。それでも、コメントしてくれてありがとう
ループ:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
機能的
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
しかし、純粋な優雅さのために、私はラングラングのものを選ばなければならないでしょう。私自身のコードでは、自分のforeachを選択します。またはテトロのダンパーの使用。
foreach
との使用法に機能的な違いはありませんmap
。map
forループをエミュレートするには、無効なコンテキストではなく、リスト変換に使用する必要があります
私の経験では、最も簡単な方法はDumpvalueを使用することです。
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
チャームのように機能し、Perlデバッガーが行うようにハッシュを出力するため(デバッグに最適)、ハッシュのフォーマットを心配する必要はありません。さらに、DumpvalueはPerlモジュールのストックセットに含まれているので、ある種の厳しいプロキシ(私が働いているような)の背後にいる場合は、CPANをいじる必要はありません。
あなたが徹底的にそれを1行に保ちたい場合は(useステートメントとシバンなしで)、私はテトロミノの答えからちょっと背を向けて提案します:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
匿名ハッシュを使用して一時変数をスキップする以外は何もしません;)