gpt4 book ai didi

perl - 为什么 $foo->{bar} 会自动激活而 %$foo 不会?

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

我有以下代码:

$headers;
some_sub( %$headers );

当我调用 some_sub 时出现错误:

Can't use an undefined value as a HASH reference at ...

但是类似的代码不会产生错误:

$headers->{ x };

为什么自动激活在第一个示例中的工作方式与第二个示例中的不同?

UPD

我注意到 @ThisSuitIsBlackNot。我真的问:

why my $h; $h->{foo} works and my $h; %$h doesn't

UPD
真实代码:

my $email =  Email::Simple->create(
header => [
To => $address,
From => $cnf->{ from },
Subject => $subject,
'Content-Type' => 'text/html; charset="utf8"',
%$headers,
],
body => $body
);

最佳答案

注意:添加到问题中的代码演示了为什么不会发生自动激活。

Short  您的 sub 采用一个列表(哈希),其中包含一个匿名数组作为元素 - 而 %$headers 被埋在该数组中。它是 anon 数组那是标量的别名,因此不需要 %$headers 是可修改的。因此不会发生自动激活,并且您会收到下面描述的致命运行时错误,因为尝试对 undefined reference 进行取消引用。


%$ref左值上下文 中使用时会自动激活。这可能发生在子调用中,见下文。

您显示的错误是由于使用了 undefined reference 。比如语句

my %hash = %{ $ref };

尝试从存储在 $ref 中的内存位置复制哈希并将其分配给 %hash。符号 %hash 是在编译时创建的,但是如果在 $ref 处没有找到 hash 或者如果在 $ref 中没有任何内容,我们得到一个错误。这里不会发生自动存活。 use strict 生效

perl -wE'use strict; my $h; my %h = %$h; say $h'

这会引发致命的运行时错误

Can't use an undefined value as a HASH reference at -e line 1.

When eval-ed to survive that

perl -wE'use strict; my $h; my %h = eval { %$h }; say $h; say "hi"'

它会打印一个关于“未初始化值”的警告,一个空行,然后是 hi。没有哈希。

但是,当用作子例程调用中的参数时,它会自动激活

perl -wE'use strict; sub tt { 1 }; my $h; tt( %$h ); say $h'

因为这会打印 HASH(0x257cd48) 行,没有警告或错误。

左值上下文中使用取消引用的对象时会发生自动激活,这意味着它需要是可修改的。在子例程调用中,原因是函数的参数在 @_ 中有别名,因此必须可以修改它们。相同的别名需要使它发生在 foreach 循环中,而 keys 重置哈希迭代器。见 this postthis postthis post .

感谢 ThisSuitIsBlackNot用于解释和链接。

在您的情况下, %$ref 作为匿名数组的元素传递,因此没有别名(arrayref 本身就是)。因此自动激活不会启动,您会收到该错误。


自动复活来自perlglossary

In Perl, storage locations (lvalues) spontaneously generate themselves as needed, including the creation of any hard reference values to point to the next level of storage. The assignment $a[5][5][5][5][5] = "quintet" potentially creates five scalar storage locations, plus four references (in the first four scalar locations) pointing to four new anonymous arrays (to hold the last four scalar locations). But the point of autovivification is that you don’t have to worry about it.

另见,例如,article from Effective Perler

关于perl - 为什么 $foo->{bar} 会自动激活而 %$foo 不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41400902/

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