我正在尝试以我理解的各种方式使用对数组的引用。
这是我的一个试验:-
my $RoR = [[2, 3], [4, 5, 7]];
my @AoA = ([2, 3], [[2, 3], [4, 5, 7]]);
my @AwR = ([2, 3], @{$RoR});
print $AoA[1][1][1], "\n"; # 1
print $AoA[1]->[1][1], "\n"; # 2
#print $RoR[0][1], "\n"; # 3
print $RoR->[0][1], "\n"; # 4
print $AwR[1][1][1], "\n"; # 5
print $AwR[1]->[1][1], "\n"; # 6
如您所见,我有三个不同的数组。
$RoR
-> 是对匿名数组的引用,其中包含两个匿名数组@AoA
-> 是一个包含 2 个匿名数组的数组。第二个匿名数组与引用指向的数组相同$RoR
@AwR
-> 与 几乎相同@AoA
,但不同之处在于,我没有使用新的匿名数组,而是在其中添加了引用@{$RoR}
本身。所以,基本上我认为,最后两个数组实际上是相同的。
现在,问题是,他们的行为方式不同。
打印语句
1
,并且2
工作正常,并打印出值5
作为结果。打印语句
3
给出错误,我知道为什么,所以没有问题。正如预期的那样,print 语句4
正在打印 value 。3
现在,当我尝试运行程序时,打印语句
5
和抛出一些错误。6
"Can't use string ("2") as an ARRAY ref while \"strict refs\" in use at D:/_Perl Practice/3perldsc/array_of_array.pl line 15."
然后我尝试使用: -
print $AwR[1][1]->[1], "\n";
print @{$RoR}[1]->[1];
在哪里,我$AwR[1]
用@{$RoR}
, 替换为$AwR[1]
contains @{$RoR}
。第二个工作正常,而第一个仍然抛出错误。
1st two
那么,the和last two
print 语句之间究竟有什么区别呢?我认为它们是相同的,因此应该为相同的索引访问提供相同的结果。但事实并非如此。我是否以某种错误的方式使用了参考?
好的,现在上面的疑问很清楚了。所以,我发布了一个答案,积累了与这个问题相关的一般内容。请看下面。在那,我对5th and 6th
打印语句有疑问,为了理解它,我尝试了以下测试: -
print $AwR[1][1]; # Allowed as `$AwR[1]` is same as `$$RoR`.
print $$RoR[1]; # Allowed as in 3(b)
print $AwR[1]->[1]; # Confused here. It is allowed
print $$RoR->[1]; # But this is not.
前三个语句打印相同reference value
。但最后一个失败了。因此,可以肯定 :-$AwR[1]
与$$RoR
. 但是,为什么$$RoR->[1]
工作时$AwR[1]->[1]
不工作?它向我抛出了这个错误:-
Not a SCALAR reference at D:/_Perl Practice/3perldsc/array_of_array.pl line 24.
那么,以两种不同的方式使用它有什么区别呢?