我如何打印Perl中的哈希内容?
我一直打印我的散列为#桶/#分配。 如何打印我的散列的内容?
不使用while
循环将是最优选的(例如, 单线程将是最好的)。
Data :: Dumper是你的朋友。
use Data::Dumper; my %hash = ('abc' => 123, 'def' => [4,5,6]); print Dumper(\%hash);
会输出
$VAR1 = { 'def' => [ 4, 5, 6 ], 'abc' => 123 };
简单:
print "$_ $h{$_}\n" for (keys %h);
优雅,但实际上慢了30%(!):
while (my ($k,$v)=each %h){print "$k $v\n"}
这里如何在不使用Data :: Dumper的情况下进行打印
print "@{[%hash]}";
出于debugging的目的,我经常使用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
。 您不需要设置许多variables,以便以比Data::Dumper
更好的格式输出它。
use Data::Dump = 'dump'; print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
最近我一直在使用Data::Printer
进行debugging。
use Data::Printer; p %variable;
{ abc 123, def [ [0] 4, [1] 5, [2] 6 ] }
(terminal上的结果可以更加丰富多彩)
与我在这里展示的其他例子不同,这个例子明确地被devise为仅用于显示目的。 如果你倒出一个绑定variables的结构或者一个对象的结构,它会更容易出现。
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" } }
我的最爱: 智能::评论
use Smart::Comments; # ... ### %hash
而已。
答案取决于你的散列。 如果你有一个简单的散列简单
print map { "$_ $h{$_}\n" } keys %h;
要么
print "$_ $h{$_}\n" for keys %h;
会做,但如果你有一个散列填充引用,你会走的那些引用,并产生一个合理的输出。 引用的这种行走通常称为序列化。 有很多模块实现不同的风格,一些比较stream行的是:
-
Data::Dumper
-
Data::Dump::Streamer
-
YAML::XS
-
JSON::XS
-
XML::Dumper
由于Data::Dumper
是核心Perl库的一部分,因此它可能是最受欢迎的; 然而,其他一些模块有很好的东西提供。
循环:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
实用
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
但对于纯粹的优雅,我不得不select饶舌。 对于我自己的代码,我会select我的foreach。 或tetro的翻斗车使用。
根据我的经验,最简单的方法就是使用Dumpvalue 。
use Dumpvalue; ... my %hash = { key => "value", foo => "bar" }; my $dumper = new DumpValue(); $dumper->dumpValue(\%hash);
像魅力一样工作,您不必担心格式化散列,因为它像Perldebugging器一样输出(非常适合debugging)。 此外,Dumpvalue包含在Perl模块的库存集合中,所以如果你在某种恶意代理的后面(比如我在工作),那么你就不必与CPAN混淆了。
如果你想迂腐,并保持一行(没有使用陈述和shebang),那么我会从tetromino的回答中解脱出来,并build议:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
除了使用匿名散列来跳过临时variables之外,没有做任何特殊的事情;)
我为散列的每个元素添加一个空格以便很好地看到它:
print map {$_ . " "} %h, "\n";
我真的很喜欢在一个class轮代码中sorting键:
print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);