2013-04-30 67 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";