缺少未定义值的错误作为哈希引用

时间:2014-11-11 21:00:32

标签: perl

我有两个代码片段,看起来应该会产生相同的结果,但后者会导致错误。

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中是可重现的。

2 个答案:

答案 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;指令(无论如何你都应该使用它)。