Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is this a bug in the CPAN Uniq module?

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

returns :

00A
1A

It should be 0A or not?!

Thank you

like image 272
Alfons Avatar asked Oct 19 '10 14:10

Alfons


3 Answers

I would suggest using the uniq function from 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\n@test2\n";

The Uniq module is at version 0.1, has had only one release, and that was back in 2003. Always check for the that sort of information when selecting a module. Modules that have multiple releases (especially recent releases) tend to be better than modules that have only one or a few releases.

like image 191
Chas. Owens Avatar answered Nov 14 '22 13:11

Chas. Owens


I guess. Here's the 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: }

The filter in line 6 only applies to duplicate and true values, so duplicate "0" values are not caught. Why don't you submit a bug report?

like image 36
mob Avatar answered Nov 14 '22 13:11

mob


This appears to be the same bug reported on CPAN for module Array::Uniq: Array::Uniq doesn't handle arrays containing entries with zero values. The only difference between Uniq and Array::Uniq is the package name; I proved this by a unix diff of their .pm files. They were both created by the same author.

That bug report was submitted 4 years ago (2006), it is still open, and the author never replied to it. The author should eliminate one of these two redundant modules. I think it is reasonable to assume the author has stopped maintaining these two modules. Use one of the alternative modules proposed by the other Answers.

like image 7
toolic Avatar answered Nov 14 '22 14:11

toolic