这是我发现的一个微妙之处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}
需要在左值上下文中,是吗? (我知道表达式是否需要在左值上下文中,自动生存如所解释的那样发生here http://www.effectiveperlprogramming.com/2011/04/understand-autovivification.
相关的post https://stackoverflow.com/questions/6419618/perl-vivification-question-while-dereferencing-undefined-array-reference.
请注意,键确实可以是左值(设置哈希的预期元素数量)。
但即使键本身不在左值上下文中使用,它也会产生重置哈希迭代器的副作用。
所以它确实修改了哈希,并为解引用提供了左值上下文,这使得它自动生存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)