Perl 数组唯一值

3

我正在尝试编写代码以确认二维数组中的每一行都具有唯一值。

@x2 = uniq( @q2 ); 产生了一个由10个元素组成的数组,而不是6个;然后$y2 = @x2; 产生了1?

我不明白为什么x2与x1不同,y2与y1不同?我期望得到5个元素的x2和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] );

3
我的 @q2 = @{ $b[$r] } ; - mpapec
1
在所示的代码中,@q2 没有 10 个元素吗?因为你把 $b[1] 赋值给它,是一个数组引用,因此是单一标量。因此,@x2 也是一样的,只有一个元素,该元素是一个数组引用。请像 @Сухой27 说的那样使用 @{$b[$r]} - zdim
1
提示:将零标量(=())分配给新创建的数组(my @b)没有意义。它已经是空的。 - ikegami
1个回答

3

数组只能包含标量。这意味着它们不能直接包含数组。因此,我们使用数组引用作为数组元素(因为引用是标量)。

由于自动初始化机制的存在,

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);
< p >而< code>[]返回对新创建的数组的引用。

因此,当您执行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],
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接