这是CPAN Uniq模块中的错误吗?

Alf*_*ons 6 arrays perl unique

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";
Run Code Online (Sandbox Code Playgroud)

回报:

00A
1A
Run Code Online (Sandbox Code Playgroud)

应该是0A还是不是?!

谢谢

Cha*_*ens 16

我建议使用以下uniq功能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";
Run Code Online (Sandbox Code Playgroud)

Uniq模块的版本为0.1,只有一个版本,而且是在2003年.在选择模块时,请务必检查该类信息.具有多个版本(特别是最新版本)的模块往往比只有一个或几个版本的模块更好.

  • 请不要使用版本<1或任何其他数字标准作为不使用模块的理由; 有很多精美的0.0x模块,人们不应该被忽视的借口.多个版本是一个更好的检查,更好的错误报告. (7认同)
  • @ysth 0.1并不是真正的问题,正是这个事实是0.1是第一个也是唯一一个版本.并且该版本早在2003年就已发布.此外,文档还不符合正常的CPAN标准.这是另一个迹象,它可能不是一个非常好的模块. (6认同)
  • 我建议使用List :: AllUtils(http://search.cpan.org/dist/List-AllUtils/)而不是List :: MoreUtils.这样做的好处是你不必记住你在寻找的是List :: Util还是List :: MoreUtils. (2认同)

mob*_*mob 9

我猜.这是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: }
Run Code Online (Sandbox Code Playgroud)

第6行中的过滤器仅适用于重复值和值,因此"0"不会捕获重复值.你为什么不提交错误报告

  • @Ruel:我认为mobrule希望鼓励OP了解RT系统,而不是他自己提交bug.在CPAN模块中找到第一个错误(另一个在核心Perl中找到一个)是非常成功的. (7认同)

too*_*lic 7

这似乎与CPAN for module上报告的错误相同Array::Uniq:Array :: Uniq不处理包含零值条目的数组.UniqArray :: Uniq之间的唯一区别是包名称; 我通过diff他们的.pm文件的unix证明了这一点.它们都是由同一作者创建的.

该错误报告是在4年前(2006年)提交的,它仍然是公开的,作者从未回复过它.作者应该消除这两个冗余模块中的一个.我认为假设作者已停止维护这两个模块是合理的.使用其他Answers提出的替代模块之一.