Perl中的Uniq函数无法正常工作

时间:2015-05-30 13:12:12

标签: arrays perl list grep uniq

我正在使用Active Perl 5.20.2。

应用于数组时,

uniq函数返回具有重复值的完整数组。请参阅下面的代码,并告知任何问题或以任何其他方式从列表中获取唯一值。

use List::MoreUtils qw(uniq);

print "@$_\n" for @urls;

@unique1 = uniq(@urls);

print "@$_\n" for @unique1;

输出

urls数组值 - 6 6 6 6 6 6 6 6 6 6 6 6

@unique 1 - 6 6 6 6 6 6 6 6 6 6 6 6

我甚至使用了以下功能而没有运气 - 可以通过搜索Google获得。

*sub uniq{
 my %seen;
 grep !$seen{$_}++, @_;
}
foreach my $value (@urls) {
if (!$seen{$value} ) 
{
push @unique1, $value;
$seen{$value} = 1;
}*

2 个答案:

答案 0 :(得分:2)

您在@urls数组中看到的是包含单个元素6的十二个匿名数组。换句话说,它看起来像这样

my @urls = ( [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6] );

uniq做的是如果字符串值与前一个元素相同,则从列表中删除多余的元素。数组引用的字符串值类似于ARRAY(0x1f6c6e4)

如果您的数组包含对相同匿名数组的12个引用,则uniq将删除除一个之外的所有内容。但看起来你有12个不同的数组恰好包含相同的值而uniq不会注意到

很难知道如何提供帮助,因为[6]与URL不太相似,数组中的实际数据可能非常不同。也许你的代码中有一个bug,或者你真的需要比较所有子阵列的内容,但是我们不能告诉

我建议您发布另一个显示@urls数组转储(使用Data::Dump)的问题,并说明您要对其执行的操作。它还可以帮助您阅读How to Ask,以便我们这些能帮助您的人不会对实际情况抱有太多怀疑

答案 1 :(得分:1)

请了解如何提供MCVE(How to create a Minimal, Complete, and Verifiable Example?)或 SSCCE(Short, Self-Contained, Correct Example) - 两个相同基本想法的名称和链接。

uniq功能确实有效。以下是转换为MCVE的代码的完整,边缘修复变体。

listuniq.pl

#!/usr/bin/env perl
use strict;        # Always use these
use warnings;

my @urls = ( 6, 6, 6, 6, 6, 6, 6, 6, 6 );

use List::MoreUtils qw(uniq);

print "Before:\n";
print "$_\n" for @urls;    # Note the @ is missing

my @unique1 = uniq(@urls);

print "After:\n";
print "$_\n" for @unique1; # Note the @ is missing

@urls = ();

push @urls, "http://www.google.com/", "http://www.yahoo.com/" for (1..6);

print "Before:\n";
print "$_\n" for @urls;

@unique1 = uniq(@urls);

print "After:\n";
print "$_\n" for @unique1;

@中的print "@$_\n"符号因use strict;而导致投诉。除非你真的计划一些非常花哨的东西,否则你需要(a)使用use strict;use warnings;以及(b)注意他们。

运行示例

$ perl listuniq.pl | so
Before:
6
6
6
6
6
6
6
6
6
After:
6
Before:
http://www.google.com/
http://www.yahoo.com/
http://www.google.com/
http://www.yahoo.com/
http://www.google.com/
http://www.yahoo.com/
http://www.google.com/
http://www.yahoo.com/
http://www.google.com/
http://www.yahoo.com/
http://www.google.com/
http://www.yahoo.com/
After:
http://www.google.com/
http://www.yahoo.com/
$

其他可能性

这是Perl,TMTOWTDI - 有多种方法可以做到这一点。这包括编写产生意外结果的代码的多种方式 - 另请参阅另一个answercommentary以获得编写代码令人困惑的结果的其他可能方法。因为你没有提供MCVE,所以我们猜测你采取了哪种方法来获得意想不到的结果,这很难 - 实际上是徒劳的。通过提供一个问题,包括重现您所看到的结果所需的最少代码,您将始终提高在SO(或任何类似网站)上获得最相关答案的机会。