Perl:计算数组中唯一元素的数量

6

我有一个简单的包含名称的数组,我想要轻松地打印出每个名称出现的次数。

我试过用大量的for循环和不同的语句来首先创建另一个具有唯一值的数组,然后尝试计算原始数组中的值并将它们存储在第三个数组中。这似乎过于复杂,我想看看是否有更简单的方法来解决这个问题。

3个回答

15

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

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
        };

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

可以简写为
my %counts;
my @unique = grep !$counts{$_}++, @names;

前者会丢失名称的顺序,而后者有保留顺序的优点(它保留重复项中的第一个)。

后者也是获取列表唯一成员的惯用方式。通常,计数哈希只是副作用,但在这种情况下,它是期望的产品。 :)


谢谢,对于我的情况来说,订单并不是很重要,但是将来可能会需要。 - Ten Digit Grid

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接