我继续将哈希打印为#sokets / #dorted。 如何打印哈希的内容?
最好不使用while
循环(例如,one-liner最好)。
答案 0 :(得分:230)
Data::Dumper是你的朋友。
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
将输出
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
答案 1 :(得分:58)
简单:
print "$_ $h{$_}\n" for (keys %h);
优雅,但实际上慢了30%(!):
while (my ($k,$v)=each %h){print "$k $v\n"}
答案 2 :(得分:33)
此处如何在不使用Data::Dumper
print "@{[%hash]}";
答案 3 :(得分:21)
出于调试目的,我经常使用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"
}
}
答案 4 :(得分:11)
答案取决于哈希中的内容。如果你有一个简单的哈希简单
print map { "$_ $h{$_}\n" } keys %h;
或
print "$_ $h{$_}\n" for keys %h;
会这样做,但如果你有一个用引用填充的哈希,那么你可以使用那些引用这些引用并生成合理输出的东西。这种引用的遍历通常称为序列化。有许多模块实现了不同的风格,一些比较流行的模块是:
由于Data::Dumper
是核心Perl库的一部分,它可能是最受欢迎的;但是,其他一些模块可以提供非常好的东西。
答案 5 :(得分:10)
答案 6 :(得分:4)
循环:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
功能
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
但是对于纯粹的优雅,我必须选择争吵。对于我自己的代码,我会选择我的foreach。或者tetro的Dumper使用。
答案 7 :(得分:2)
根据我的经验,最简单的方法就是使用Dumpvalue。
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
像魅力一样工作,你不必担心格式化哈希,因为它像Perl调试器那样输出它(非常适合调试)。另外,Dumpvalue包含在Perl模块的库存中,所以如果你支持某种严厉的代理(比如我在工作),你就不必乱用CPAN。
答案 8 :(得分:1)
如果你想变得迂腐并将它保持在一条线上(没有使用陈述和shebang),那么我会撇开tetromino的回答并建议:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
除了使用匿名哈希跳过临时变量之外,没有做任何特殊事情;)
答案 9 :(得分:1)
我为哈希的每个元素添加一个空格以便很好地看到它:
print map {$_ . " "} %h, "\n";
答案 10 :(得分:1)
我真的很想在一个班轮代码中对键进行排序:
print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);