gpt4 book ai didi

perl - 关于 "Can' 的不一致行为 t 使用未定义的值作为 ARRAY 引用”

转载 作者:行者123 更新时间:2023-12-04 11:21:57 25 4
gpt4 key购买 nike

为什么会出现以下代码:

use strict;
use warnings;
no warnings 'uninitialized';

use Data::Dumper;

my $user;
my @data = @{$user->{ENTERPRISE}}; # Error on this line
print Dumper($user), qq{Done!\n};

抛出错误“ Can't use an undefined value as an ARRAY reference”,而代码如下:
use strict;
use warnings;
no warnings 'uninitialized';

use Data::Dumper;

my $user;
foreach my $enterprise(@{$user->{ENTERPRISES}}) {
print qq{Enterprise:}, $enterprise;
}
print Dumper($user), qq{Done!\n};

不抛出任何东西,而是返回:
$VAR1 = {
'ENTERPRISES' => []
};
Done!

两者都有违规代码,但只有一个抛出错误。

可能的答案: Perl's autovivification?

我在正确的轨道上吗?感谢您的输入。

最佳答案

是的,在第二种情况下发生的事情称为自动激活,它只发生在第二种情况下,因为自动激活只发生在左值 [1] 上。

所以

@{ $x } = $y;

方法
@{ $x //= [] } = $y;


$y = @{ $x };

并不意味着
$y = @{ $x //= [] };

请记住,foreach 将其循环变量别名为它迭代的列表的每个元素,因此这些元素被评估为左值。

Autovivification 记录在 perlref 中,您可以通过 autovivification 控制自动激活语用。

  • 如果最终的延迟后跟一个索引(例如 ->[]->{} ),则引用表达式本身被评估为左值,即使索引的整体不是。这意味着 $y = $x->[0];$y = ${ $x }[0];可以自动激活$x即使 $y = @{ $x };惯于。
  • 关于perl - 关于 "Can' 的不一致行为 t 使用未定义的值作为 ARRAY 引用”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34640932/

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