我很难理解为什么下面这些方法是有效的:
my $array_reference;
foreach $element (@{$array_reference}) {
# some code
}
而下面的代码不起作用
my $array_reference;
if (scalar (@{$array_reference}) {
# some code here
}
我知道perl带来了(自动生动的)未定义的引用。但我仍然感到困惑,因为为什么后面的代码段抛出了致命的错误。
发布于 2011-06-21 12:33:24
在左值上下文中取消引用autovivify (意味着当需要可修改的值时),并且foreach创建左值上下文。
>perl -E"$$x = 1; say $x;"
SCALAR(0x74b024)
>perl -E"++$$x; say $x;"
SCALAR(0x2eb024)
>perl -E"\$$x; say $x;"
SCALAR(0x30b024)
>perl -E"sub {}->($$x); say $x;"
SCALAR(0x27b03c)
>perl -E"for ($$x) {} say $x;"
SCALAR(0x25b03c)
后两个函数创建了一个左值上下文,因为它们需要一个值来分别作为$_[0]
和$_
的别名。
发布于 2011-06-21 11:19:36
Perl在这方面有不一致之处,但一般来说,可能修改结构的代码会自动激活,而不会自动激活的代码就会尝试取消引用未定义的值,这会触发警告,或者在use strict "refs"
下引发异常。
https://stackoverflow.com/questions/6419618
复制相似问题