我有两个代码片段,看起来应该会产生相同的结果,但后者会导致错误。
1:
my $href = undef;
my @values = values %{ $href };
# OK - @values is empty
2:
my $href = undef;
my %hash = %{ $href }; # <-- Error here
my @values = values %hash;
# ERROR: Can't use an undefined value as a HASH reference
为什么同一行中的values
允许它工作?我宁愿他们都抛出错误,因为使用未定义的值作为哈希引用显然是一个错误。我没有更新版本的perl可供测试,但这在5.8.8和5.10.1中是可重现的。
答案 0 :(得分:0)
自动复活是在延迟undef
my $ref;
say $ref // "[undef]"; # / # Outputs: [undef]
$ref->{abc} = 123; # This autovivifies a hash and a reference to it.
say $ref // "[undef]"; # Outputs: HASH(0x...)
say for keys %$ref; # Outputs: abc
仅当在左值上下文中取消引用时,才会发生自动生存。
my $ref;
%$ref = ( abc => 123 ); # Autovivifies
my $ref;
my %h = %$ref; # Error
sub的参数在左值上下文中评估。我不知道命名操作符(如values
)的操作数是否在左值上下文中求值是否存在任何一致性,但是values
的操作数显然是这种情况。 / p>
my $ref;
say $ref // "[undef]"; # / # Outputs: [undef]
values %$ref;
say $ref // "[undef]"; # Outputs: HASH(0x...)
当不进行自动验证时,您会尝试去引用undef,这毫无意义,因此会导致错误。
答案 1 :(得分:-1)
值是一个函数,它接受散列,数组或泛型表达式作为参数(如所述here)。 如果将undef作为参数传递给&#34; values&#34;,它只会将其检测为空并且不返回任何值。 另一方面,如果您尝试将undef显式转换为哈希值,它将失败,因为它缺少键值对。
编辑:准确一点。这个错误发生在&#34; strict&#34;指令(无论如何你都应该使用它)。