0

目的 我正在制作一个散列并打印它以计算大型文档中单词的频率。在结果文件中,我收到了一些意想不到的条目。

问题 哈希有一个额外的输出 HASH(0x55b0ac)

我在故障排除方面的进展

在将代码分解成更小的部分并单独测试每个组件之后,我发现问题出在打印哈希上。我在这里写了一小段代码,它复制了同样的问题。

代码:

my %testhash = {};
$teststr = "using this for testing this that";

foreach $word (split(' ', lc $teststr)) {
$testhash{$word}++;
}

foreach $word (sort keys %testhash) {
    print $word."\t".$testhash{$word}."\n";
}

预期产出

for     1
testing 1
that    1
this    2
using   1

获得的输出

HASH(0x55b0ac)
for     1
testing 1
that    1
this    2
using   1

注意 我知道我的问题可以通过使用 if 条件来解决,如果 $testhash{$word} 为 NULL,则不打印一行。我的问题是了解这个意外进入的原因。它与声明哈希或打印它有关吗?

编辑:每次我重新运行代码时,数字 0x55b0ac 都会改变

4

3 回答 3

8

你的问题是第一行。这有效:

my %testhash;
my $teststr = "using this for testing this that";

foreach my $word (split(' ', lc $teststr)) {
    $testhash{$word}++;
}

foreach my $word (sort keys %testhash) {
    print $word."\t".$testhash{$word}."\n";
}
于 2013-07-05T06:54:30.150 回答
2
 use Data::Dumper;
 # your other code here
 print Dumper(\%testhash);

我通常做上面的... Data::Dumper 是一个非常有用的模块

于 2013-07-05T19:56:12.550 回答
0

我是这样想的。。

my %testhash;
my $teststr = "using this for testing this that";
$testhash{$_}++ for split /\s+/, lc $teststr;
print $_ . "\t" . $testhash{$_} . "\n", for sort keys %testhash;
于 2013-07-05T07:10:06.013 回答