如何计算perl中哈希中的重复项

时间:2013-05-06 08:21:42

标签: perl

请耐心等待。

  

编写一个程序,读取一系列单词(每行一个单词) 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

有人可以指导我如何在这个上使用哈希吗?感谢

3 个答案:

答案 0 :(得分: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.

答案 1 :(得分:-2)

这是三次,因为你有三次外循环迭代,每次都产生相同的结果(3次)。

一个很简单的方法是:

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

foreach my $occur (sort keys %occurs) {
    print "$occur seen $occurs{$occur} times\n";
}

答案 2 :(得分:-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."
}

它简单易读,易于维护。