在Perl中使用[]进行定义时无法区分数组

Raj*_*Raj 2 arrays perl

当我使用以下代码时,它可以正常工作:

#!/usr/bin/perl

use strict;
use Data::Dumper;
use Array::Utils qw(:all);

my @a = (1,2,3,4,5,6);
my @b = (1,2,3,4,7,8,9,10);
my @c = (2,1,4,3,6,5);

print "a: ".Dumper(@a)."\n";
print "b: ".Dumper(@b)."\n";
print "c: ".Dumper(@c)."\n";
print "a-b: ".Dumper(array_minus(@a, @b))."\n";
#print "b-a: ".Dumper(array_minus(@b, @a))."\n";
#print "c-b: ".Dumper(array_minus(@c, @b))."\n";
#print "b-c: ".Dumper(array_minus(@b, @c))."\n";
#print "a-c: ".Dumper(array_minus(@a, @c))."\n";
print "c-a: ".Dumper(array_minus(@c, @a))."\n";
print "c in a: ".Dumper(intersect(@c, @a))."\n";
Run Code Online (Sandbox Code Playgroud)

但是,当我对数组代码使用这种类型的声明不起作用时:

#!/usr/bin/perl
use strict;
use Data::Dumper;
use Array::Utils qw(:all);

my @a = [1,2,3,4,5,6];
my @b = [1,2,3,4,7,8,9,10];
my @c = [2,1,4,3,6,5];

print "a: ".Dumper(@a)."\n";
print "b: ".Dumper(@b)."\n";
print "c: ".Dumper(@c)."\n";
print "a-b: ".Dumper(array_minus(@a, @b))."\n";
#print "b-a: ".Dumper(array_minus(@b, @a))."\n";
#print "c-b: ".Dumper(array_minus(@c, @b))."\n";
#print "b-c: ".Dumper(array_minus(@b, @c))."\n";
#print "a-c: ".Dumper(array_minus(@a, @c))."\n";
print "c-a: ".Dumper(array_minus(@c, @a))."\n";
print "c in a: ".Dumper(intersect(@c, @a))."\n";
Run Code Online (Sandbox Code Playgroud)

我需要使用[]定义数组,因为在我的原始代码中使用Array::Diff->diff它时,它会返回添加和删除的两个数组,这两个数组使用[]而不是()存储,因此我的array_minus相交操作失败。

Sob*_*que 5

那是因为这些事情做了完全不同的事情。

my @a = (1,2,3,4,5,6);

my @a = [1,2,3,4,5,6];
Run Code Online (Sandbox Code Playgroud)

方括号定义匿名列表,并返回引用。因此,在第二种情况下,您可以有效地创建多维数据结构。

$VAR1 = [
          1,
          2,
          3,
          4,
          5,
          6
        ];
Run Code Online (Sandbox Code Playgroud)

VS.

$VAR1 = [
          [
            1,
            2,
            3,
            4,
            5,
            6
          ]
        ];
Run Code Online (Sandbox Code Playgroud)

注意额外的支架。您可以访问as @{$a[0]}并在代码中获得相同的结果。

但是方括号的主要目的是指定一个引用:

my $a_ref = [1,2,3,4,5,6];
print Dumper $a_ref;
Run Code Online (Sandbox Code Playgroud)

本质上,这就是您正在执行的操作-以第二个示例为例:

my @a = [1,2,3,4,5,6]; 

print "a has ", scalar @a, " elements\n";
print join ("\n", @a );
Run Code Online (Sandbox Code Playgroud)

打印:

a has 1 elements
ARRAY(0x346dd4)
Run Code Online (Sandbox Code Playgroud)

因为@a是一个包含引用的单元素数组,Dumper会“遵循”该数组以获取其余数据结构。

可能是您正在执行的函数调用没有执行此操作,这就是为什么它不起作用的原因。