gpt4 book ai didi

perl - 意外的参数自动激活

转载 作者:行者123 更新时间:2023-12-04 02:06:51 24 4
gpt4 key购买 nike

显然我对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 也作为参数提供给 sub有效吗?

最佳答案

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

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

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

  • 这些都不处理左值(也不处理 warn )。

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

    Turns off autovivification for lvalue dereferencing expressions, such as :   [...]



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

    当我将它添加到您的代码中时,
    no autovivification qw(fetch exists delete warn store);
    # ...

    我得到

    引用在 noautoviv.pl 第 8 行进行了生动化。
    引用在 noautoviv.pl 第 16 行进行了生动化。
    死于 noautoviv.pl 第 19 行。

    关于perl - 意外的参数自动激活,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42668114/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com