2012-04-17 8 views
5

Ich habe ein einfaches Array mit Namen drin, und ich möchte in der Lage sein, die Häufigkeit, mit der jeder Name erscheint, einfach auszudrucken.Perl: Zähle einzigartige Elemente im Array

Ich habe versucht, eine Menge von for-Schleifen eine Diff-Anweisungen zuerst ein anderes Array mit eindeutigen Werten machen, dann versuchen, die Werte im orinal-Array zu zählen und speichern sie in einem dritten Array. Das schien übermäßig komplex zu sein, und ich wollte sehen, ob es vielleicht einen viel einfacheren Weg dafür gab.

Antwort

13

Verwenden Sie einen Hash der Anzahl der einzelnen Name kommt zu zählen:

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

Der einfachste Weg, dies zu tun Vorteil von Hashes zu nehmen ist.

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

Dies gibt Ihnen einen Hash, der wie folgt aussieht: zu

verkürzt werden kann
my %counts; 
my @unique = grep !$counts{$_}++, @names; 

Erstere verliert die Reihenfolge der Namen, während letztere

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

hat den Vorteil, die Reihenfolge zu erhalten. (Es behält das erste von Duplikaten.)

Letzteres ist auch eine idiomatische Weise, einzigartige Mitglieder einer Liste zu erhalten. Normalerweise sind die Zählungen nur ein Nebeneffekt, aber in diesem Fall ist es ein gewünschtes Produkt. :)

+0

danke, in meiner Situation Reihenfolge spielt keine Rolle, aber ich brauche das in der Zukunft – searayman

Verwandte Themen