由autovivification创建的哈希有额外的密钥

Ame*_*mey 1 perl hash autovivification

这就是我所拥有的

my %count_words;

while (<DATA>){
    my $line= $_;
    chomp $line;
    my @words = split (/ /, "$line");
    foreach my $word(@words){
        $count_words{"$word"}++;
    }
}

foreach my $key (%count_words){
    print "\"$key\" occurs \"$count_words{$key}\" times\n";
}

__DATA__
we name is something
this is what it does
we food food food food
Run Code Online (Sandbox Code Playgroud)

这是我得到的输出

"it" occurs "1" times
"1" occurs "" times
"what" occurs "1" times
"1" occurs "" times
"name" occurs "1" times
"1" occurs "" times
"food" occurs "1" times
"1" occurs "" times
"does" occurs "1" times
"1" occurs "" times
"is" occurs "2" times
"2" occurs "" times
"we" occurs "2" times
"2" occurs "" times
"food" occurs "3" times
"3" occurs "" times
"something" occurs "1" times
"1" occurs "" times
"this" occurs "1" times
"1" occurs "" times
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么创建这些额外的密钥本质上是先前创建的key-> value对的值.

这是我所期待的

"it" occurs "1" times
"what" occurs "1" times
"name" occurs "1" times
"food" occurs "1" times
"does" occurs "1" times
"is" occurs "2" times
"we" occurs "2" times
"food" occurs "3" times
"something" occurs "1" times
"this" occurs "1" times
Run Code Online (Sandbox Code Playgroud)

有人可以纠正我明显的错误吗?

Tim*_*m A 6

你的错误在你的foreach循环中,你需要这个keys函数:

foreach my $key ( keys %count_words){
    print "\"$key\" occurs \"$count_words{$key}\" times\n";
}
Run Code Online (Sandbox Code Playgroud)

否则,您foreach正在遍历所有键和值.


TLP*_*TLP 5

问题是你没有使用

use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)

如果你有,它会给你一个关于你的代码中的错误的线索

Use of uninitialized value $count_words{"1"}...
Run Code Online (Sandbox Code Playgroud)

或者那种效果.

正如Tim A已经指出的那样,问题是你在列表上下文中使用了哈希,这意味着它扩展为键和值.你应该像他建议的那样使用这个keys功能.