我正在尝试理解perldsc文档中的"常见错误"部分.当他提到时,作者试图传达的是什么:
构造像数组数组之类的两个最常见的错误是意外地计算元素的数量,或者重复引用相同的内存位置.在这种情况下,您只需获取计数而不是嵌套数组:
for my $i (1..10) {
my @array = somefunc($i);
$AoA[$i] = @array; # WRONG!
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当它迭代时,它将取第一个值(1..10),即1,并将它传递给这样的函数:
my @array = somefunc(1);
Run Code Online (Sandbox Code Playgroud)
由于没有定义该函数,我将创建逻辑.
sub somefunc {
my $a = shift;
print $a * $a;
}
Run Code Online (Sandbox Code Playgroud)
这基本上会这样做:
1 * 1
Run Code Online (Sandbox Code Playgroud)
结果是'1'.
根据我的理解,我的@array看起来像:
@array = ('1');
Run Code Online (Sandbox Code Playgroud)
下一行将做:
$AoA[$i] = @array;
Run Code Online (Sandbox Code Playgroud)
我假设$ AoA [$ 1]是一个匿名数组(他/她没有用'my',btw声明)而@array将是这个匿名数组的第一个元素,作者说它'错了.并为每个循环迭代到'2'.
somefunc(2);
Run Code Online (Sandbox Code Playgroud)
这将是'4'并传递给:
$AoA[$i] = @array
Run Code Online (Sandbox Code Playgroud)
使用此代码的作者有什么意义呢?我试图理解错误,但更重要的是,我正在努力理解代码.任何帮助将不胜感激.
UPDATE
我想我明白为什么这是一个常见的错误,因为当我使用print和Dumper时,我可以直观地看到作者试图传达的内容,这里是修改后的代码.
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
for my $i (1..10) {
my @AoA;
my @array = somefunc($i);
print "The array is Dumper(@array)\n";
$AoA[$i] = @array; # WRONG!
print Dumper($AoA[$i]);
}
sub somefunc {
my $a = shift;
return $a * $a;
}
Run Code Online (Sandbox Code Playgroud)
他/她表示,在perldoc perldsc的常见错误段落中
在这种情况下,您只需获取计数而不是嵌套数组:
以下是翻斗车的输出.
The array is Dumper(1)
$VAR1 = 1;
The array is Dumper(4)
$VAR1 = 1;
The array is Dumper(9)
$VAR1 = 1;
The array is Dumper(16)
$VAR1 = 1;
The array is Dumper(25)
$VAR1 = 1;
The array is Dumper(36)
$VAR1 = 1;
The array is Dumper(49)
$VAR1 = 1;
The array is Dumper(64)
$VAR1 = 1;
The array is Dumper(81)
$VAR1 = 1;
The array is Dumper(100)
$VAR1 = 1;
Run Code Online (Sandbox Code Playgroud)
所以我假设重复了
$VAR1 = 1;
Run Code Online (Sandbox Code Playgroud)
是计数而不是嵌套数组.
作者确实指出,如果计数是我真正想要的,那么就像这样重写代码:
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
for my $i (1..10) {
my @count;
my @array = somefunc($i);
print "The array is Dumper(@array)\n";
$count[$i] = scalar @array;
print Dumper($count[$i]);
}
sub somefunc {
my $a = shift;
return $a * $a;
}
Run Code Online (Sandbox Code Playgroud)
但文档没有告诉我如何获得嵌套数组?
UPDATE
如果我错了,请纠正我,但我重写代码以获取嵌套数组:
#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my @count;
my @new_array;
for my $i (1..10) {
#my @count;
my @array = somefunc($i);
push @new_array, [@array];
}
sub somefunc {
my $a = shift;
return $a * $a;
}
print Dumper(\@new_array);
Run Code Online (Sandbox Code Playgroud)
哪个印刷
$VAR1 = [
[
1
],
[
4
],
[
9
],
[
16
],
[
25
],
[
36
],
[
49
],
[
64
],
[
81
],
[
100
]
];
Run Code Online (Sandbox Code Playgroud)
在以下声明中:
$AoA[$i] = @array;
Run Code Online (Sandbox Code Playgroud)
该@array被引用的标量环境,产生了许多其元件.LHS强加了上下文,它是数组$AoA[$i]的单个元素@AoA.
在Perl中,严格意义上没有数组数组.它们基本上由"扁平"数组或带引用的数组模拟.对于后者,您需要使用take reference运算符,如:
$AoA[$i] = \@array;
Run Code Online (Sandbox Code Playgroud)
对于入门者,您可能会发现,Data::Dumper在检查复杂数据结构(例如arrayrefs和hashrefs)时非常方便.