perl:计算数组中的唯一元素

时间:2012-04-17 15:01:59

标签: arrays perl counting

我有一个带有名字的简单数组,我希望能够轻松打印出每个名字出现的次数。

我已尝试制作一大堆for循环的diff语句,然后先创建另一个具有唯一值的数组,然后尝试计算orinal数组中的值并将它们存储在第3个数组中。这看起来过于复杂,我想看看是否有更简单的方法可以做到这一点。

3 个答案:

答案 0 :(得分:14)

使用哈希计算每个名称出现的次数:

use warnings;
use strict;
use Data::Dumper;
$Data::Dumper::Sortkeys=1;

my @names = qw(bob mike joe bob);
my %counts;
$counts{$_}++ for @names;
print Dumper(\%counts);

__END__

$VAR1 = {
          'bob' => 2,
          'joe' => 1,
          'mike' => 1
        };

答案 1 :(得分:4)

my %counts;
++$counts{$_} for @names;
my @unique = keys(%counts);

可以缩短为

my %counts;
my @unique = grep !$counts{$_}++, @names;

前者失去了名字的顺序,而后者则具有保留顺序的优点。 (它保留了重复的第一个。)

后者也是获取列表中唯一成员的惯用方法。通常情况下,计数只是副作用,但在这方面,它是一种理想的产品。 :)

答案 2 :(得分:3)

最简单的方法是利用哈希值。

my @names = qw/joe bob sue bob mike sally mike bob sally dale joe/;
my %counts;
$counts{$_}++ for @names;

这将为您提供如下所示的哈希:

      'dale' => 1,
      'sue' => 1,
      'joe' => 2,
      'mike' => 2,
      'bob' => 3,
      'sally' => 2