arrays - perl 数组唯一值

标签 arrays perl unique

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

@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/

相关文章:

java - for循环中同时初始化两个变量

perl - 尝试使用 for 循环读取数组中的元素

scala - 如何生成从集合中挑选的 n 个唯一元素的列表?

perl - 在 perl 中关闭多个输出管道而不阻塞每个管道

perl - 如何定义 Mojo::Server::Prefork 的生成处理程序?

c - 尝试生成每个唯一数字为9的数字

prolog - 如何使用SWI Prolog为加权有向图找到唯一的最短路径?

javascript - 数组 "property lists"叫什么,它们与简单对象有何不同?

javascript - 如何从 ArrayBuffer 获取数组?

Java - 如何在不排序的情况下检查扑克牌中的顺子?