Хэш, созданный автовивификацией, имеет дополнительные ключи

Это то, что у меня есть

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

и это результат, который я получаю

"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

мой вопрос заключается в том, почему создаются эти дополнительные ключи, которые по сути являются значениями ранее созданной пары ключ-> значение.

это то, что я ожидал

"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

Может ли кто-нибудь исправить мою очевидную ошибку?


person Amey    schedule 10.12.2012    source источник


Ответы (3)


ваша ошибка в вашем цикле foreach, вам нужна функция keys:

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

в противном случае ваш foreach перебирает все ключи И значения.

person Tim A    schedule 10.12.2012

Проблема в том, что вы не используете

use strict;
use warnings;

Если бы вы это сделали, это дало бы вам ключ к пониманию ошибки в вашем коде.

Use of uninitialized value $count_words{"1"}...

Или что-то в этом роде.

Проблема в том, как уже указал Тим А, что вы используете хеш в контексте списка, что означает, что он расширяется как в ключи, так и в значения. Вы должны, как он предложил, использовать функцию keys.

person TLP    schedule 10.12.2012

Пытаться:

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

Проблема в том, что когда вы перебираете хэш, вы попеременно перебираете ключи и значения.

person Community    schedule 10.12.2012