我有一個簡單的數組,其中包含名稱,我希望能夠輕鬆打印每個名稱出現的次數。perl:計算數組中的唯一元素
我已經嘗試了大量for循環diff語句,首先使用唯一值創建另一個數組,然後嘗試計算orinal數組中的值並將它們存儲在第三個數組中。這似乎過於複雜,我想看看是否有更簡單的方法來做到這一點。
我有一個簡單的數組,其中包含名稱,我希望能夠輕鬆打印每個名稱出現的次數。perl:計算數組中的唯一元素
我已經嘗試了大量for循環diff語句,首先使用唯一值創建另一個數組,然後嘗試計算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 @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
my %counts;
++$counts{$_} for @names;
my @unique = keys(%counts);
可縮短至
my %counts;
my @unique = grep !$counts{$_}++, @names;
前者失去了名稱的順序,而後者具有維護訂單的優勢。 (它保留重複的第一個。)
後者也是獲得列表的唯一成員的慣用方式。通常情況下,計數只是一個副作用,但在這一點上,它是一個理想的產品。 :)
謝謝,在我的情況順序並不重要,但我可能需要在未來 – searayman 2012-04-17 17:06:54