(contributo di brian d foy)
Usate un hash. Quando state pensando alle parole "unico" oppure "duplicato",
state pensando alle "chiavi di un hash".
Se non vi importa dell'ordine degli elementi, potreste semplicemente creare
l'hash e poi estrarre le chiavi. Non è importante come create
quell'hash: ma è importante che usiate la funzione keys per ottenere
gli elementi unici.
my %hash = map { $_, 1 } @array;
# oppure uno slice di hash: @hash{ @array } = ();
# oppure un foreach: $hash{$_} = 1 foreach ( @array );
my @unici = keys %hash;
Potete anche iterare per ogni elemento e tralasciare quelli che avete
già incontrato. Utilizzate un hash per tenerne traccia. La prima
volta che nel loop si incontra un elemento, questo elemento non ha alcuna
chiave in %visti. L'istruzione next crea la chiave ed usa immediatamente
il suo valore, che è undef, di modo che il loop vada avanti alla
push ed incrementi il valore per quella chiave. La volta successiva che
nel loop si incontra lo stesso elemento, la sua chiave esiste già
nell'hash e il valore per quella chiave è vero (visto che non
è né 0 né undef), dunque il next salta l'iterazione
e nel loop si va all'elemento successivo.
my @unici = ();
my %visti = ();
foreach my $elemento ( @array )
{
next if $visti{ $elemento }++;
push @unici, $elemento;
}
Potete scriverlo in maniera più concisa usando un grep, che fa
la medesima cosa.
my %visti = ();
my @unici = grep { ! $visti{ $_ }++ } @array;
|