我正在尝试编写代码来确认二维数组中的每一行都具有所有唯一值。
@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,0,0,5,0,7,0,0,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,0,0,0,9,3,5,6,7);
push @{ $b[1] }, (6,0,0,5,0,7,0,0,1,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,0,0,0,9,3,5,6,7);
是
的缩写push @{ $b[0] //= [] }, (0,8,0,0,0,9,3,5,6,7);
[]
返回对新创建数组的引用。
所以当你执行 my @q2 = $b[$r];
时,你将一个标量分配给 @q2
(由隐式 []
)。要复制 $b[$r]
引用的数组元素,您可以使用
my @q2 = @{ $b[$r] };
顺便说一句,下面可以写得更好:
push @{ $b[0] }, (0,8,0,0,0,9,3,5,6,7);
由于$b[0]
在执行时不存在,我们可以使用
$b[0] = [0,8,0,0,0,9,3,5,6,7];
最后,没有理由硬编码0
。我们可以使用
push @b, [0,8,0,0,0,9,3,5,6,7];
所以我们得到
my @b; # Note the lack of a useless, noisy "= ()".
push @b, [0,8,0,0,0,9,3,5,6,7];
push @b, [6,0,0,5,0,7,0,0,1,0];
或
my @b = (
[0,8,0,0,0,9,3,5,6,7],
[6,0,0,5,0,7,0,0,1,0],
);
关于arrays - perl 数组唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63538469/