Perl循环遍历哈希会产生奇怪的值

时间:2010-12-12 08:06:13

标签: perl

我正在使用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";
}

1 个答案:

答案 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