我有一个包含名称的简单数组,我希望能够轻松打印出每个名称出现的次数。
我尝试制作大量的 for 循环和差异语句,以首先制作另一个具有唯一值的数组,然后尝试计算 orinal 数组中的值并将它们存储在第三个数组中。这似乎过于复杂,我想看看是否有更简单的方法来做到这一点。
使用哈希计算每个名称出现的次数:
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
};
my %counts;
++$counts{$_} for @names;
my @unique = keys(%counts);
可以缩短为
my %counts;
my @unique = grep !$counts{$_}++, @names;
前者失去了名称的顺序,而后者具有保留顺序的优点。(它保留第一个重复项。)
后者也是获取列表唯一成员的惯用方式。通常,计数只是一个副作用,但在这种情况下,它是一个理想的产品。:)
最简单的方法是利用哈希。
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