我正在使用Perl来解析objdump
的输出。我有以下代码:
#!/usr/bin/perl
%count = {};
while (<>) {
if (/^\s+[[:xdigit:]]+:\s+[[:xdigit:]]+\s+([a-z]+).+$/) {
++$count{"$1"};
}
}
while (($key, $val) = each %count) {
print "$key $val\n";
}
在结果输出中,大多数部分都可以这样:
strhib 2
strcc 167
stmlsda 4
swivc 21
ldmlsia 4
但有一条奇怪的路线:
HASH(0x8ae2158)
这里发生了什么?我希望$1
是一个字符串,++$count{"$1"}
应该完全正常。
谢谢。
所以正确的代码应该是:
#!/usr/bin/perl
use strict;
my %count;
while (<>) {
if (/^\s+[[:xdigit:]]+:\s+[[:xdigit:]]+\s+([a-z]+).+$/) {
++$count{"$1"};
}
}
while (my ($key, $val) = each %count) {
print "$key $val\n";
}
答案 0 :(得分:8)
如果你有use warnings;
,你会看到:“参考文献找到了偶数大小的列表”。而不是
%count = {};
你应该说
my %count;
你写的内容与此相同:
%count = ({} => undef);
也就是说,您使用空hashref初始化哈希作为没有关联值的键。 hashref字符串化为“HASH(0x8ae2158)”(数字可能会改变)。要清除散列,请使用parens ()
而不是大括号{}
。大括号构造一个哈希引用。
即便是这样的短节目也应该从:
开始use strict;
use warnings;
你捕获的bug将是你自己的。 : - )
warnings pragma优先于-w
开关,因为它在词法上起作用。请参阅What's wrong with -w
and $^W
中的perllexwarn。