Search code examples
perlhashautovivification

Hash created by autovivification has extra keys


This is what I have

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

and this is the output i get

"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

my question is why are there these additional keys created which are essentially the values of the previously created key->value pair.

this is what i would expect

"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

Can someone please correct my obvious mistake?


Solution

  • your error is in your foreach loop, you need the keys function:

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

    otherwise, your foreach is iterating through all keys AND values.