11

显然我对no autovivification pragma 的理解是不完美的,因为以下脚本的 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.

问题:为什么当作为参数提供给$foo子时自动激活$foo->{bar},即使no autovivification是有效的?

4

1 回答 1

11

在子例程调用中,函数的参数别名为@_,因此必须可以修改它们。这提供了一个左值上下文,它将触发自动生存。

当我们查看您在autovivification中使用的功能的描述时,它们包括:

  • 'fetch' -- “右值解引用表达式”
  • 'exists'--“取消引用作为存在的一部分的表达式”
  • 'delete'-- "取消引用作为删除部分的表达式"

这些都没有处理左值(也没有warn)。

要在子例程调用中停止自动激活,您需要添加store

关闭左值取消引用表达式的自动激活,例如:[...]

文档继续示例,包括子例程调用。

当我将它添加到您的代码中时,

no autovivification qw(fetch exists delete warn store);
# ...

我明白了

参考在 noautoviv.pl 第 8 行被激活。
参考在 noautoviv.pl 第 16 行被激活。
死于 noautoviv.pl 第 19 行。
于 2017-03-08T10:44:36.163 回答