2013-04-30 48 views
5

我需要测试,无论我的hashref是否包含0个元素。 我用这个代码:如何检查散列引用在perl中是否为空

$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. 

回答

12

如果您想使用

%hash 

的哈希,你会使用

%{ $hash } 

为参考,所以它是

keys %{ $self->{href} } 

注意:在某些版本的P erl,keys接受参考。但是,这是一个被放弃的实验性功能。一个人不应该使用它。

+0

如果_ref_是不是哈希有可能做到这一点'如果(键$自我! - > { '的href'}){}'中的if语句。在所有Perl版本中工作是否一样? – 2015-02-28 18:37:29

+0

不是。那是一个放弃的实验性功能。 – ikegami 2016-11-08 20:15:25

+0

这是否返回空或0? – landesko 2017-08-28 15:19:57

2

使用引用与像keys内建函数仅在新皮尔斯支持。为了获得最大的兼容性,您需要取消对它的引用第一:

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
2

您需要取消对它的引用作为哈希:

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

对于TIMTOWTDI,以检查是否有任何键,你不需要keys:如果

print "undefined" unless %{ $self->{href} }; 
+1

在他使用的Perl版本中,最后一个代码片段将不必要地遍历整个散列。只是fyi。 – ikegami 2013-04-30 18:24:37

1

要找出哈希具有的元素,你只是用它在标量上下文:

scalar %h 

%h ? "yup" : "nope" 

scalar keys %h%h计数键实现同样的目的,但最好还是问你真的想知道什么。

但是,无论哪种方式,%h都是散列而不是hashref。 (尽管Perl的某些版本允许hashref作为参数keys。)给定一个表达式EXPR,其计算结果为hashref,通过说%{ EXPR }得到相应的散列值。与你的示例代码放在一起,我们得到

print "size of hashref: " . keys(%{ $self->{href} }) . ".\n"; 
print "hash " . (%{ $self->{href} } ? "does" : "does not") . " contain elements\n";