为什么使用keys()而不是%{..}进行自动修复?

时间:2016-01-27 04:45:38

标签: perl hash key dereference autovivification

这是我在keys()找到的一个微妙之处。

$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my @e = keys(%{$d->{cd}});'

$ perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; my %e = %{$d->{cd}};'
Can't use an undefined value as a HASH reference at -e line 1.

我最困惑的是为什么第一个代码段不会出现解除引用错误。当我使用Data::Dumper时,很明显,在第一个代码段$d->{cd}中,自动归档为{}

为什么keys需要自动生成?我尝试阅读perldoc,找不到令人满意的答案。 keys没有设置别名($_等),所以perl不需要认为$d->{cd}需要在左值上下文中,是吗? (我理解表达式是否需要在左值上下文中进行自动生成,如解释Pandas documentation所述。

相关的here

2 个答案:

答案 0 :(得分:4)

请注意,键确实可以是左值(设置哈希的预期元素数)。

但是即使key本身没有在左值上下文中使用,它也会产生重置哈希迭代器的副作用。

所以它确实修改了哈希,因此给dereference一个左值上下文,这使得它自动生成。

答案 1 :(得分:0)

经过一些研究和询问后,我发现这与$d->{cd}传递给子程序的事实有关,而不是keys的事实。例如,

% perl -e 'use warnings; use strict; my $d = { "ab" => 1 }; sub foo {}; my @e = foo(%{$d->{cd}});'

这也将自动生存;这是因为内部perl需要能够为函数参数设置别名。

foo()内,我们有一个别名集$_[0] = $d->{cd}但这意味着$d->{cd}需要左值,因为perl中的子程序假设您可以执行$_[0] = "123";之类的操作因此需要实现自动化。