如何在 Perl 中打印散列的内容?

我一直将我的散列打印为分配的桶/# 。 如何打印散列的内容?

不使用 while循环将是最好的(例如,一句话将是最好的)。

375526 次浏览

简单:

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

优雅,但实际上慢了30% (!) :

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

数据: : Dumper 是你的朋友。

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

将输出

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

如果你想表现得迂腐一点,并且只说一句话(不用 use 语句和 shebang) ,那么我就借用 tetromino 的回答,提出以下建议:

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

除了使用匿名散列跳过临时变量之外,没有做任何特殊的事情;)

循环:

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

功能性的

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

但是为了纯粹的优雅,我必须选择错误的。对于我自己的代码,我会选择我自己的方法。或者是 Tetro 的垃圾车。

我的最爱: 评论

use Smart::Comments;
# ...


### %hash

就是这样。

答案取决于散列中的内容。如果有一个简单的散列,则

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

或者

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

但是如果您有一个由引用填充的散列,那么您将可以遍历这些引用并产生合理的输出。这种引用遍历通常称为序列化。有许多模块实现了不同的风格,其中一些比较流行的是:

由于 Data::Dumper是核心 Perl 库的一部分,因此它可能是最流行的; 但是,其他一些模块也提供了很好的功能。

根据我的经验,最简单的方法就是使用 一文不值

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

工作原理很简单,您不必担心如何格式化散列,因为它像 Perl 调试器那样输出散列(对于调试非常有用)。另外,Dumpvalue 包含在 Perl 模块的库存集中,所以如果您支持某种严格的代理(就像我在工作一样) ,那么您不必使用 CPAN。

为了调试的目的,我经常使用 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
]
}

(在终端上,结果可以更加丰富多彩)

与我在这里展示的其他示例不同,这个示例被明确设计为仅用于显示目的。如果您输出绑定变量或对象的结构,则更容易显示。

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"
}
}

下面介绍如何在不使用 Data::Dumper的情况下打印

print "@{[%hash]}";

我为散列的每个元素附加一个空格以便更好地查看它:

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

我真的很喜欢用一行代码来排序密钥:

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