2013-12-10 41 views
1

我審閱劇本,我所遇到的,我不能想出一個塊:不理解什麼%的做在Perl

if ((@ifAliasVals[1])&&(%{@ifAliasVals[0]})) { 

... 

} 

什麼%{@ifAliasVals[0]}在做什麼?

回答

4
if (@ifAliasVals[1] && %{ @ifAliasVals[0] }) 

是寫

if ($ifAliasVals[1] && %{ $ifAliasVals[0] }) 

%{ EXPR }是散列解引用的好方法。 %{ EXPR }%hash基本相同,但是通過引用而不是名稱訪問。

在標量上下文中,%hash如果散列具有任何元素則返回true,因此%{ $ifAliasVals[0] }將檢查由$ifAliasVals[0]引用的散列是否包含元素。

my $hash1_ref = { }; 
my $hash2_ref = { a => 1 }; 
say %{ $hash1_ref } ? 'has elements' : 'empty'; # empty 
say %{ $hash2_ref } ? 'has elements' : 'empty'; # has elements 
+3

作爲一個便箋,我很驚訝指數是不同的。 'if($ ifAliasVals [0] &&%{$ ifAliasVals [0]})'會更有意義。 (「如果'$ ifAliasVals [0]'包含散列引用,並且引用的散列具有元素,則...」) – ikegami

+0

完美!謝謝。 – cellis

2

語法%{ ... }對待大括號作爲散列基準之間的表達,和取消引用它,給您整個散列。

語法@ifAliasVals[0]從數組@ifAliasVals返回一個數組切片。在這種情況下,陣列分片只有一個元素,所以最好寫成$ifAliasVals[0]。無論如何,它給了你數組@ifAliasVals的第一個元素。

因此,整個表達式%{ @ifAliasVals[0] }@ifAliasVals的第一個元素解釋爲散列引用,將其解引用,產生該散列的內容。

在上述if語句的上下文中,如果散列具有任何元素,&&的右側將爲真,如果散列爲空,則將爲假。