7

我需要测试我的 hashref 是否包含 0 个元素。我使用了这段代码:

$self = { fld => 1 };
%h = ( "a" => "b" );
$self->{href} = { %h };
print STDERR $self->{href}{ "a" };
print STDERR "\n";
print "size of hash:  " . keys( %h ) . ".\n";
print "size of hashref:  " . keys( $self->{href} ) . ".\n";

它适用于 perl 5.16,但适用于 perl 5.10:

Type of arg 1 to keys must be hash (not hash element) at - line 7, near "} ) "
Execution of - aborted due to compilation errors.
4

4 回答 4

17

如果你用

%hash

对于哈希,你会使用

%{ $hash }

供参考,所以

keys %{ $self->{href} }

注意:在某些 Perl 版本中,keys接受引用。然而,这是一个被放弃的实验性功能。一个人不应该使用它。

于 2013-04-30T18:21:25.880 回答
3

要找出哈希是否有元素,只需在标量上下文中使用它:

scalar %h

或者

%h ? "yup" : "nope"

scalar keys %h通过计算 中的键来实现相同的目的%h,但最好询问您真正想知道的内容。

然而,无论哪种方式%h都是哈希而不是哈希引用。(尽管某些版本的 Perl 确实允许将 hashref 作为 . 的参数keys。)给定一个EXPR计算结果为 hashref 的表达式,您可以通过说 得到相应的哈希值%{ EXPR }。把它和你的示例代码放在一起,我们得到

print "size of hashref:  " . keys( %{ $self->{href} } ) . ".\n";
print "hash " . (%{ $self->{href} } ? "does" : "does not") . " contain elements\n";
于 2013-04-30T19:16:13.367 回答
2

keys仅在较新的 Perls 中支持使用带有内置函数的引用。为了获得最大的兼容性,您需要先取消引用它:

print "size of hashref:  " . keys( %{ $self->{href} } ) . ".\n";
于 2013-04-30T18:21:12.787 回答
2

您需要将其取消引用为哈希:

print "size of hashref: ", keys %{ $self->{href} }, "\n";

对于 TIMTOWTDI,要检查它是否有任何键,您不需要keys

print "undefined" unless %{ $self->{href} };
于 2013-04-30T18:21:31.737 回答