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