【发布时间】:2023-03-28 14:25:02
【问题描述】:
显然我对 no autovivification 杂注的理解并不完美,因为以下脚本的 not-dying-on-line-19 行为让我非常惊讶。
use 5.014;
use strict;
use warnings;
no autovivification qw(fetch exists delete warn);
{
my $foo = undef;
my $thing = $foo->{bar};
# this does not die, as expected
die if defined $foo;
}
{
my $foo = undef;
do_nothing( $foo->{bar} );
# I would expect this to die, but it doesn't
die unless defined $foo;
}
sub do_nothing {
return undef;
}
运行脚本会产生:
Reference was vivified at test.pl line 8.
问题:即使no autovivification 有效,为什么$foo->{bar} 作为参数提供给sub 时$foo 会自动激活?
【问题讨论】:
-
你安装了吗?也许将
warn添加到 unimports 列表中。那将是no autovivification qw<fetch exists delete warn>;,看看是否有警告,当它像文档说的那样被避免时。 -
它已安装,否则脚本将在第 11 行终止。我已使用添加
warn的结果更新了问题。 -
这并不奇怪。 Perl 并不知道
do_nothing什么都不做,因为你给了它一个参数,它必须自动激活它,这样你就可以在 sub 中使用它。特别是,它不知道你对$_[0]是否在do_nothing做作。 -
这是有道理的。不过,这感觉像是可以在文档中更清楚地说明的东西,因为任何来自按值传递语言的人都会感到惊讶。
-
它在 sub 中的运行方式有一个关键的区别(它是一个 lvalue 上下文,对象必须是可修改的)。我认为this answer 可以解释它。
标签: perl autovivification