这是我在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。
答案 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";
之类的操作因此需要实现自动化。