我想了解perldsc文檔中的'常見錯誤'部分。作者試圖傳達什麼時,他提到:瞭解perl中的數據結構
構造類似於數組數組中的兩個最常見的錯誤是要麼意外計算元素的數量,要麼反覆地引用相同的內存位置。在這裏你剛纔得到的計數,而不是一個嵌套的數組的情況下:
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;
我假設$農產品協議[$ 1]是一個匿名數組(他/她沒有用'my'聲明,btw),@array將是這個匿名數組的第一個元素,作者說它是'錯誤的。每次循環迭代到'2'。
somefunc(2);
,這將是「4」,並傳遞到:
$AoA[$i] = @array
什麼是筆者這段代碼是錯的點。我試圖理解哪些是錯誤的,但更重要的是,我試圖理解代碼。任何幫助將不勝感激。
UPDATE
我想我明白爲什麼這是一個常見的錯誤,因爲當我使用印刷和翻斗車,我可以直觀地看到是作者想傳達,這裏是修改後的代碼。
#!/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;
是計數,而不是嵌套數組。
筆者的確表明,如果算上是我真正想要再改寫這樣的代碼:
#!/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;
}
但文件沒有告訴我怎麼去嵌套數組?
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);
打印了
$VAR1 = [
[
1
],
[
4
],
[
9
],
[
16
],
[
25
],
[
36
],
[
49
],
[
64
],
[
81
],
[
100
]
];
我認爲應該'返回$ a * $ a'而不是'print $ a * $ a'? '$ AoA [$ i]'指的是常規數組「@ AoA」的元素(作者沒有聲明)。賦值'$ AoA [$ i] = @ array'在標量上下文中,所以'@ array'將計算爲數組長度 –
Re「* @ array將是這個匿名數組的第一個元素*」,否,標量上下文中的「@ array」計算出「@ array」中的元素數量。 – ikegami
請注意,該示例試圖演示如何將'@ array'放在'@ AoA'的元素中,所以'sub somefunc {my $ i = shift;返回($ i * 2,$ i * 3); ''會成爲一個更好的例子。 – ikegami