Answers:
数据::倾销者是你的朋友。
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
在该示例中不存在。
在这里,您无需使用即可如何打印 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
]
}
(结果在终端上可以更加丰富多彩)
与我在此显示的其他示例不同,此示例明确设计为仅用于显示目的。如果转储绑定变量或对象的结构,则显示起来更容易。
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;
但是为了纯粹的优雅,我不得不选择wrang-wrang的。对于我自己的代码,我选择我的foreach。或tetro的自卸车使用。
foreach
和的使用没有功能上的区别map
。map
应该用于列表转换,而不是在空上下文中模拟for循环