2012-04-17 28 views
5

Mam prostą tablicę z nazwami i chcę mieć możliwość łatwego wydrukowania liczby wyświetleń każdej nazwy.perl: policz unikatowe elementy w tablicy

Próbowałem zrobić tonę pętli dla instrukcji diff, aby najpierw utworzyć inną tablicę o unikalnych wartościach, próbując policzyć wartości w tablicy orinal i przechowywać je w trzeciej tablicy. To wydawało się zbyt skomplikowane i chciałem sprawdzić, czy być może było o wiele prostszy sposób na zrobienie tego.

Odpowiedz

13

Użyj skrótu, aby policzyć, ile razy każda nazwa zdarzenia:

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

Najprostszym sposobem na to jest do skorzystania z mieszań.

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

To daje hash, który wygląda tak:

 'dale' => 1, 
     'sue' => 1, 
     'joe' => 2, 
     'mike' => 2, 
     'bob' => 3, 
     'sally' => 2 
4
my %counts; 
++$counts{$_} for @names; 
my @unique = keys(%counts); 

można skrócić do

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

Były traci kolejność nazwisk, podczas gdy druga ma tę zaletę, że zachowuje zamówienie. (Zachowuje pierwszy z duplikatów.)

Ten drugi to również idiomatyczny sposób na uzyskanie unikalnych członków listy. Zwykle liczba zliczeń jest tylko efektem ubocznym, ale w tym jest pożądanym produktem. :)

+0

dzięki, w mojej sytuacji Zamówienie nie ma większego znaczenia, ale mogę potrzebować tego w przyszłości – searayman