1

これは私が持っているものです

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

誰かが私の明らかな間違いを訂正してもらえますか?

4

3 に答える 3

6

あなたのエラーは foreach ループにあります。keys関数が必要です:

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

それ以外の場合は、foreachすべてのキーと値を繰り返し処理しています。

于 2012-12-10T16:35:28.627 に答える
5

問題は、あなたが使用していないことです

use strict;
use warnings;

もしそうなら、それはあなたのコードのエラーに関する手がかりを与えたでしょう

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

またはその趣旨の何か。

問題は、ティム A が既に指摘したように、リスト コンテキストでハッシュを使用していることです。つまり、キーと値の両方に展開されます。彼が提案したように、keys関数を使用する必要があります。

于 2012-12-10T16:38:51.463 に答える
2

試す:

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

問題は、ハッシュを反復処理するときに、キー値を交互に反復処理することです。

于 2012-12-10T16:36:24.850 に答える