2012-04-17 15 views
5

Tengo una matriz simple con nombres en ella, y quiero poder imprimir fácilmente la cantidad de veces que aparece cada nombre.perl: contar elementos únicos en la matriz

He intentado hacer un montón de bucles for y diff para crear primero otra matriz con valores únicos, tratando de contar los valores en la matriz orinal y almacenarlos en una tercera matriz. Esto parecía demasiado complejo, y quería ver si tal vez había una manera mucho más simple de hacer esto.

Respuesta

13

uso de un hash para contar el número de veces que cada nombre aparece:

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

La forma más sencilla de hacerlo es tomar ventaja de hashes.

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

Esto le dará un hash que se parece a:

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

se puede acortar a

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

El primero pierde el orden de los nombres, mientras que el segundo tiene la ventaja de preservar el orden. (Guarda el primero de los duplicados.)

Este último es también una manera idiomática de obtener miembros únicos de una lista. Normalmente, el tener conteos es solo un efecto secundario, pero en esto, es un producto deseado. :)

+0

gracias, en mi situación El pedido no importa demasiado, pero puede que necesite esto en el futuro – searayman

Cuestiones relacionadas