当我使用以下代码时,它可以正常工作:
#!/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";
但是,当我对数组代码使用这种类型的声明时,它不起作用:
#!/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";
我需要使用[]定义数组,因为在我使用Array::Diff->diff
的原始代码中,它返回两个添加和删除的数组,这些数组使用[]代替()存储,因为我的array_minus
相交操作失败。
答案 0 :(得分:4)
那是因为这些东西完全不同。
my @a = (1,2,3,4,5,6);
my @a = [1,2,3,4,5,6];
方括号定义匿名列表,返回引用。因此,在第二种情况下,您可以有效地创建多维数据结构。
$VAR1 = [
1,
2,
3,
4,
5,
6
];
Vs以上。
$VAR1 = [
[
1,
2,
3,
4,
5,
6
]
];
请注意额外的支架。您可以将此作为@{$a[0]}
访问,并在代码中获得相同的结果。
但方括号的主要目的是分配参考:
my $a_ref = [1,2,3,4,5,6];
print Dumper $a_ref;
基本上你正在做的事情 - 举个例子:
my @a = [1,2,3,4,5,6];
print "a has ", scalar @a, " elements\n";
print join ("\n", @a );
打印:
a has 1 elements
ARRAY(0x346dd4)
因为@a
是一个包含引用的单个元素数组,所以Dumper“跟随”它以获取数据结构的其余部分。
有可能你正在进行的函数调用没有这样做,这就是它无法正常工作的原因。