-2

请多多包涵。

编写一个程序,读取一系列单词(每行一个单词)1直到输入结束,然后打印每个单词被看到的次数的摘要。(提示:记住,当一个未定义的值被当作一个数字来使用时,Perl 会自动将其转换为 0。回顾一下之前保持运行总计的练习可能会有所帮助。)如果输入单词是 fred,barney 、fred、dino、wilma、fred(都在单独的行上),输出应该告诉我们 fred 被看到了 3 次。为了获得额外的分数,请在输出中按 ASCII 顺序对摘要词进行排序。

[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

这是一种方法:

#!/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 回答