2010-10-19 5 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"; 

kehrt:Ist das ein Fehler im CPAN Uniq-Modul?

00A 
1A 

Es 0A sein sollte oder nicht ?!

Danke

+2

Alternativ können Sie Folgendes verwenden: @ test1 = Werte% {{map {$ _ => $ _} @ test1}}. –

+0

'sub uniq {Schlüssel% {{map {$ _, 1} @_}}' – Zaid

+1

@Zaid: die Verwendung von Schlüsseln funktioniert nicht mit nicht-skalaren Werten (zB: gesegnetes Objekt). Hash-Keys sind immer skalare oder skalare Werte. Wenn Sie Ihre uniq-Implementierung verwenden, skalieren Sie alle Werte von @_. –

Antwort

9

, denke ich. Hier ist der 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: } 

Der Filter in Zeile 6 gilt nur für doppelte und wahr Werte, so duplizieren "0" Werte werden nicht gefangen. Warum hast du nicht submit a bug report?

+0

* Warum reichen Sie keinen Fehlerbericht ein? * - Der Grund, warum er die Frage stellt, ist, weil er nicht weiß, ob es sich um einen Fehler handelt oder ob etwas in seinem Code nicht stimmt. :) – Ruel

+7

@Ruel: Ich denke, dass mobrule das OP dazu ermutigen will, mehr über das RT-System zu erfahren, als dass er selbst einen Bug ablegt. Es ist eine ziemliche Leistung, den ersten Fehler in einem CPAN-Modul gefunden zu haben (und einen anderen im Kern von Perl). – Ether

+0

Ok, "List :: MoreUtils qw/uniq /" scheint gut zu funktionieren :) – user476918

16

Ich würde vorschlagen, die uniq Funktion von List::MoreUtils mit:

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"; 

Das Uniq Modul in der Version 0.1 ist, ist nur eine Veröffentlichung hat, und das war im Jahr 2003. Immer für die Information dieser Art überprüfen wenn Sie ein Modul auswählen. Module mit mehreren Releases (insbesondere neuere Releases) sind tendenziell besser als Module mit nur einem oder wenigen Releases.

+2

Ich würde empfehlen, List :: AllUtils (http://search.cpan.org/dist/List-AllUtils/) anstelle von List :: MehrUtils. Der Vorteil dabei ist, dass Sie sich nicht merken müssen, ob das, was Sie suchen, in List :: Util oder List :: MoreUtils steht. – mfollett

+7

Bitte verwenden Sie nicht Version <1 oder andere numerische Kriterien als Grund, kein Modul zu verwenden; Es gibt viele feine 0.0x Module da draußen, die Menschen sollten nicht eine Entschuldigung zu übersehen bekommen. Mehrfache Veröffentlichungen sind eine viel bessere Sache zu prüfen, und hervorragende Fehler berichten noch besser. – ysth

+6

@ysth 0.1 ist nicht wirklich das Problem, es ist diese Tatsache, dass 0.1 das erste und einzige Release war. Und dass die Freigabe im Jahr 2003 erfolgte. Auch die Dokumentation entspricht nicht den normalen CPAN-Standards. Dies ist ein weiteres Zeichen, dass es wahrscheinlich kein sehr gutes Modul ist. –

7

Dies scheint der gleiche Fehler zu sein, der in CPAN für Modul Array::Uniq: Array::Uniq doesn't handle arrays containing entries with zero values gemeldet wurde. Der einzige Unterschied zwischen Uniq und Array::Uniq ist der Paketname; Ich habe dies durch ein Unix diff ihrer .pm-Dateien bewiesen. Sie wurden beide vom selben Autor erstellt.

Dieser Bug-Bericht wurde vor 4 Jahren (2006) eingereicht, ist noch offen, und der Autor hat nie darauf geantwortet. Der Autor sollte eines dieser beiden redundanten Module eliminieren. Ich denke, es ist vernünftig anzunehmen, dass der Autor aufgehört hat, diese beiden Module beizubehalten. Verwenden Sie eines der alternativen Module, die von den anderen Antworten vorgeschlagen werden.