Arrays Perl中的Uniq函数不起作用
我正在使用活动Perl 5.20.2 uniq函数应用于数组时,返回具有重复值的完整数组。请参考下面的代码,如果有任何问题,请告知,或者通过其他方式从列表中获取唯一值Arrays Perl中的Uniq函数不起作用,arrays,perl,list,grep,uniq,Arrays,Perl,List,Grep,Uniq,我正在使用活动Perl 5.20.2 uniq函数应用于数组时,返回具有重复值的完整数组。请参考下面的代码,如果有任何问题,请告知,或者通过其他方式从列表中获取唯一值 use List::MoreUtils qw(uniq); print "@$_\n" for @urls; @unique1 = uniq(@urls); print "@$_\n" for @unique1; 输出 URL数组值-6 @独特的1-6 6 6 我甚至不走运地使用了下面的功能——它们可以从谷歌搜索得到 请
use List::MoreUtils qw(uniq);
print "@$_\n" for @urls;
@unique1 = uniq(@urls);
print "@$_\n" for @unique1;
输出
URL数组值-6
@独特的1-6 6 6
我甚至不走运地使用了下面的功能——它们可以从谷歌搜索得到
请学习如何提供MCVE()或 SSCCE()-同一基本思想的两个名称和链接
uniq
功能不起作用。这里是一个完整的、略微固定的代码变体,它被转换成了MCVE
listuniq.pl
打印“@$\n”
中的@
符号导致投诉,因为使用严格代码>。除非你真的在计划一些非常奇特的事情,否则你需要(a)使用严格代码>和使用警告代码>和(b)注意它们
示例运行
其他可能性
这就是Perl,TMTOWTDI——有多种方法可以做到这一点。这包括编写产生意外结果的代码的多种方法——请参阅另一种方法,并参阅另一种答案,以了解编写导致混乱结果的代码的其他可能方法。因为您没有提供MCVE,所以我们很难(基本上是徒劳的)猜测您采取了哪种选择来获得意外的结果。通过提供一个包含再现所见结果所需的最少代码的问题,您将始终提高在SO(或任何类似网站)上获得最相关答案的机会。您的@URL
数组中似乎有十二个匿名数组,其中包含单个元素6。换句话说,它看起来像这样
my @urls = ( [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6] );
uniq
的作用是,如果多余元素的字符串值与前一个元素的字符串值相同,则从列表中删除多余元素。数组引用的字符串值类似于array(0x1f6c6e4)
如果您的数组包含十二个对同一匿名数组的引用,则uniq
将删除除一个之外的所有引用。但是看起来有12个不同的数组恰好包含相同的值,uniq
不会注意到这一点
很难知道如何提供帮助,因为[6]
不太像URL,数组中的实际数据可能非常不同。也许您的代码中有一个bug,或者您真的需要比较所有辅助数组的内容,但我们无法判断
我建议您发布另一个问题,该问题显示了@url
数组的转储(使用),并描述了您希望如何使用它。它还可以帮助您阅读,这样我们这些帮助您的人就不会对真实情况产生如此多的怀疑您可以提供一个完整的示例程序来演示您的问题。您能否编辑示例代码以显示如何初始化@url
?看起来@url
是一个值为“6 6 6 6 6 6”的列表,否则每个6
之间会有换行符……“Perl中的Uniq函数不工作”。。。是的。认真地其他人也用过。你认为这样的问题没有被注意到吗?是的,偶尔,但更多的时候,不是这样,就是他有一个值,“6 6 6 6”。这更可能是因为他在第一个循环中,用尾随的换行符打印数组的每个元素,而输出中只有一个换行符。@Kusalananda:是的。这将是一个单独的匿名数组。谢谢你,乔纳森。我会考虑你以后的所有评论。你的代码可以工作。我已经开发了另一个工作环境,它也在工作。
#!/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;
$ 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/
$
my @urls = ( [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6], [6] );