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

$testhash{$word} が NULL の場合、if 条件を使用し、行を出力しないことで問題を解決できることを知っていることに注意してください。私の質問は、この予期しないエントリの理由を理解することです. ハッシュの宣言や印刷と関係がありますか?

編集:コードを再実行するたびに、番号 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 に答える