2012-04-17 43 views
5

我有一個簡單的數組,其中包含名稱,我希望能夠輕鬆打印每個名稱出現的次數。perl:計算數組中的唯一元素

我已經嘗試了大量for循環diff語句,首先使用唯一值創建另一個數組,然後嘗試計算orinal數組中的值並將它們存儲在第三個數組中。這似乎過於複雜,我想看看是否有更簡單的方法來做到這一點。

回答

13

使用散列計算每個名字出現的次數:

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 
     }; 
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 
4
my %counts; 
++$counts{$_} for @names; 
my @unique = keys(%counts); 

可縮短至

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

前者失去了名稱的順序,而後者具有維護訂單的優勢。 (它保留重複的第一個。)

後者也是獲得列表的唯一成員的慣用方式。通常情況下,計數只是一個副作用,但在這一點上,它是一個理想的產品。 :)

+0

謝謝,在我的情況順序並不重要,但我可能需要在未來 – searayman 2012-04-17 17:06:54