2010-10-19 1 views
6
use Uniq; 

my @test1 = ("0","0","A"); 
my @test2 = ("1","1","A"); 

@test1 = uniq sort @test1; 
@test2 = uniq sort @test2; 

print "$_" for @test1; 
print "\n"; 
print "$_" for @test2; 
print "\n"; 

rendimenti:Si tratta di un errore nel modulo Uniq CPAN?

00A 
1A 

Dovrebbe essere 0A o no ?!

Grazie

+2

In alternativa, è possibile utilizzare: @ test1 = valori% {{map {$ _ => $ _} @ test1}}. –

+0

'sub uniq {keys% {{map {$ _, 1} @_}}' – Zaid

+1

@Zaid: l'uso delle chiavi non funzionerà con valori non scalari (eq: oggetto benedetto). Le chiavi di hash sono sempre valori scalari o scalari. L'utilizzo della tua implementazione uniq scalerà ogni valore di @_. –

risposta

9

Immagino. Ecco il source code to uniq

1: sub uniq{ 
2: # Eliminates redundant values from sorted list of values input. 
3: my $prev = undef; 
4: my @out; 
5: foreach my $val (@_){ 
6:  next if $prev && ($prev eq $val); 
7:  $prev = $val; 
8:  push(@out, $val); 
9: } 
10: return @out; 
11: } 

Il filtro in linea 6 si applica solo a duplicare e veri valori, in modo da duplicare "0" valori non vengono catturati. Perché non lo fai submit a bug report?

+0

* Perché non invii un bug report? * - Il motivo per cui sta facendo la domanda è perché non sa se questo è un bug, o c'è solo qualcosa di sbagliato nel suo codice. :) – Ruel

+7

@Ruel: Penso che mobrule voglia incoraggiare l'OP a conoscere il sistema RT, piuttosto che a presentare un bug. È un bel risultato aver trovato il primo bug in un modulo CPAN (e un altro trovarne uno nel core Perl). – Ether

+0

Ok, "List :: MoreUtils qw/uniq /" sembra funziona bene :) – user476918

16

Io suggerirei di usare la funzione uniq da List::MoreUtils:

use strict; 
use warnings; 

use List::MoreUtils qw/uniq/; 

my @test1 = uniq qw(0 0 A); 
my @test2 = uniq qw(1 1 A); 

print "@test1\[email protected]\n"; 

Il modulo Uniq è alla versione 0.1, ha avuto un solo rilascio, e che era nel 2003. Controllare sempre per il questo genere di informazioni quando si seleziona un modulo. I moduli con più versioni (specialmente le versioni recenti) tendono ad essere migliori dei moduli che hanno solo una o poche versioni.

+2

Mi consiglia di utilizzare List :: AllUtils (http://search.cpan.org/dist/List-AllUtils/) anziché List :: moreutils. Il vantaggio di farlo è che non devi ricordare se ciò che stai cercando è in List :: Util o List :: MoreUtils. – mfollett

+7

Si prega di non utilizzare la versione <1 o altri criteri numerici come motivo per non utilizzare un modulo; Ci sono molti buoni moduli 0.0x là fuori che la gente non dovrebbe essere data una scusa per trascurare. Le versioni multiple sono una cosa molto migliore da controllare, e rapporti bug ancora migliori ancora. – ysth

+6

@ysth 0.1 non è proprio il problema, è il fatto che 0.1 è stata la prima e unica release. E che il rilascio era già nel 2003. Anche la documentazione non è conforme ai normali standard CPAN. Questo è un altro segno che probabilmente non è un ottimo modulo. –

7

Questo sembra essere lo stesso bug segnalato su CPAN per il modulo Array::Uniq: Array::Uniq doesn't handle arrays containing entries with zero values. L'unica differenza tra Uniq e Array::Uniq è il nome del pacchetto; Ho provato questo con un unix diff dei loro file .pm. Sono stati entrambi creati dallo stesso autore.

Quel bug report è stato presentato 4 anni fa (2006), è ancora aperto, e l'autore non ha mai risposto ad esso. L'autore dovrebbe eliminare uno di questi due moduli ridondanti. Penso che sia ragionevole supporre che l'autore abbia smesso di mantenere questi due moduli. Utilizzare uno dei moduli alternativi proposti dalle altre risposte.