“构建类似于数组的数组时最常见的两个错误是意外计算元素数量或多次引用同一内存位置。这里是你只得到计数而不是嵌套数组的情况:”。
for my $i (1..10) {
my @array = somefunc($i);
$AoA[$i] = @array; # WRONG!
}
据我了解,当它迭代时,它会取(1..10)中的第一个值,即1,并将其传递给以下函数:
my @array = somefunc(1);
由于该函数未定义,我将创建逻辑。
sub somefunc {
my $a = shift;
print $a * $a;
}
这将基本上会做到以下几点:
1 * 1
结果将会是'1'。
据我理解,我的 @array 将会长成这样:
@array = ('1');
接下来的代码将执行:
$AoA[$i] = @array;
我假设$AoA[$1]是一个匿名数组(作者没有用'my'声明),而@array将是这个匿名数组的第一个元素,但作者说这是错误的。并且foreach循环将迭代到“2”。
somefunc(2);
将会是'4'并传递给:
$AoA[$i] = @array
这段代码有什么问题,作者的意图是什么?我正在尝试理解其中的错误,更重要的是,我正在努力理解这段代码。任何帮助都将不胜感激。
更新
我认为我明白了为什么这是一个常见的错误,因为当我使用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;
}
在perldoc perldsc的“常见错误”段落中,作者指出:
以下是只获取计数而非嵌套数组的情况:
下面是Dumper的输出。
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;
我假设重复出现的
$VAR1 = 1;
这里的count是指计数,而不是嵌套数组。
作者确实指出,如果我真正想要的是计数,那么可以按照以下方式重写代码:
#!/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;
}
但是文档没有告诉我如何获取嵌套数组?
更新
如果我错了,请纠正我,但我重写了代码以获取嵌套数组:
#!/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);
这是关于打印的问题
$VAR1 = [
[
1
],
[
4
],
[
9
],
[
16
],
[
25
],
[
36
],
[
49
],
[
64
],
[
81
],
[
100
]
];
return $a * $a
而不是print $a * $a
?而$AoA[$i]
是指常规数组@AoA
的第$i
个元素(作者没有声明)。赋值$AoA[$i] = @array
处于标量上下文中,因此@array
将求出数组的长度。 - Håkon Hægland@array
的值为@array
中元素的数量。 - ikegami@array
放置在@AoA
的元素中,因此sub somefunc { my $i = shift; return ( $i*2, $i*3 ); }
将作为更好的示例。 - ikegami$ AoA [$i] = \@ array;
。 使用Dumper打印$AOA并查看结果。 - Dave Cross