我如何打印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);