-2

我慢してください。

一連の単語 (1 行に 1 単語) 1を入力の終わりまで読み取るプログラムを作成し、各単語が表示された回数の要約を出力します。(ヒント: 未定義の値が数値であるかのように使用されると、Perl は自動的にそれを 0 に変換することを覚えておいてください。現在の合計を保持していた以前の演習を振り返ると役立つ場合があります。) 入力単語が fred の場合、barney 、fred、dino、wilma、fred (すべて別の行にあります) の場合、出力は fred が 3 回見られたことを示しているはずです。追加のクレジットとして、出力で要約単語を ASCII 順に並べ替えます。

[1] 入力行から個々の単語を抽出する方法をまだ示していないため、1 行に 1 単語である必要があります。

これはハッシュを使用する必要があります。そして、私はその方法を理解できません。配列を使用し、2 つのループを使用して重複を比較することしか考えられません。私は問題を正しく理解していなかったと思います。これが配列を使用した私のコードです。

#! usr/bin/perl
use warnings;
use strict;

chomp(my @input = <STDIN>);

foreach my $name (@input) {
    my $count;

    foreach my $compare_name (@input) {
        if ($name eq $compare_name) {
            $count += 1;
        }
    }

    print "$name seen $count times\n";
}

しかし、これは例えば次のように出力します:

myname
myname
myname

it prints:
myname seen 3 times
myname seen 3 times
myname seen 3 times

誰かがこれにハッシュを使用する方法を教えてもらえますか? ありがとう

4

3 に答える 3

2

つまり、単語に関連付けられたカウントにアクセスしようとしているということです。

単語を配列のインデックスとして使用し、その配列要素にカウントを格納できれば...

まあ、それはまさにハッシュとは何かです。演習で推奨されたのは当然のことです。

$counts{$word}     # Retrieves the count associated with a word.

++$counts{$word};  # Increment the number of times you've seen a word.

keys(%counts)      # Returns a list of the words you have encountered.
于 2013-05-06T08:34:14.593 に答える
-2

外側のループが 3 回繰り返され、それぞれ同じ結果 (3 回) が得られるため、これは 3 回です。

非常に簡単な方法は次のとおりです。

my %occurs;
while (<STDIN>)  {
    chomp($_);
    $occurs{$_}++;
}

foreach my $occur (sort keys %occurs) {
    print "$occur seen $occurs{$occur} times\n";
}
于 2013-05-06T08:26:31.773 に答える
-2

1 つの方法を次に示します。

#!/usr/bin/perl -w


use v5.14;
use strict;

my %map;
chomp(my @words = <STDIN>);

foreach my $word (@words) {
    $map{$word} += 1;
}

foreach my $key (sort keys %map) {
    say "$key occurs $map{$key} times."
}

シンプルで読みやすく、保守が容易です。

于 2013-05-06T08:51:29.277 に答える