如何解决perl数组唯一值
我正在尝试编写代码,以确认二维数组中的每一行都具有唯一值。
@x2 = uniq( @q2 );
产生的数组包含10个元素,而不是6个;然后$y2 = @x2;
产生1?
我不明白为什么x2与x1不同并且y2与y1不同?我期望x2具有5个元素,并且y2 = 5(就像y1)。我该如何解决?
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
use List::MoreUtils qw(uniq);
my @q1 = (6,5,7,1,0);
my @x1 = uniq( @q1 );
my $y1 = @x1;
print "y1 = ",Dumper( $y1 );
print "x1 = ",Dumper( @x1 );
print "q1 = ",Dumper( @q1 );
print '====='."\n";
my @b = ();
push @{ $b[0] },(0,8,9,3,6,7);
push @{ $b[1] },(6,0);
my $r=1;
my @q2=$b[$r];
my @x2 = uniq( @q2 );
my $y2 = @x2;
print "y2 = ",Dumper( $y2 );
print "x2 = ",Dumper( @x2 );
print "q2 = ",Dumper( @q2 );
print "b[r]=",Dumper( $b[$r] );
解决方法
数组只能包含标量。这意味着它们不能包含数组,至少不能直接包含数组。因此,我们使用对数组的引用作为数组元素(因为引用是标量)。
多亏了自我生存,
push @{ $b[0] },(0,8,9,3,5,6,7);
是
的缩写push @{ $b[0] //= [] },7);
然后[]
返回对新创建的数组的引用。
因此,当您执行my @q2 = $b[$r];
时,您将为@q2
分配一个标量(由隐式[]
创建的标量)。要复制$b[$r]
引用的数组的元素,可以使用
my @q2 = @{ $b[$r] };
顺便说一句,可以更好地编写以下内容:
push @{ $b[0] },7);
由于$b[0]
执行时不存在,因此我们可以使用
$b[0] = [0,7];
最后,没有理由对0
进行硬编码。我们可以使用
push @b,[0,7];
所以我们得到
my @b; # Note the lack of a useless,noisy "= ()".
push @b,7];
push @b,[6,7,1,0];
或
my @b = (
[0,7],0],);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。