2008-10-27 55 views
13

我在看下面的代碼片段:

my @ret = <someMethod> 
return (undef) if($DB_ERROR); 
return (undef) unless ($#ret >= 0); 

是否$#只是給你一個數組中元素的計數?

+1

我在標題改爲$#至$#數組。你應該認識到$#本身就是一個神奇的變量(儘管我認爲它已經在Perl 5.10中被刪除) – 2008-10-27 21:19:07

+6

另外,我想指出你的腳本中有一個潛在的錯誤。你不應該返回(undef),而只是說退貨。在列表上下文中,您的函數將評估爲true! – 2008-10-27 21:23:20

回答

34

$#arrayname給你的最後一個元素的索引,因此,如果陣列@ret具有2個元素然後$#ret是1

而且,正如由Barry布朗,空數組給出-1指出。

爲了讓你可以使用數組在標量上下文長度:

print scalar @ret; 
+0

另外,如果@ret中沒有任何內容,$#ret將返回-1。 – 2008-10-27 21:22:55

5

請注意,$#數組表達式將返回-1,當陣列具有零個元素。

23

edg是正確的,但原始代碼是不必要的鈍。在大多數情況下,$#foo是一個紅旗,可以使用scalar @foo更簡單地編寫代碼。

return (undef) unless ($#ret >= 0); 

unless foo >= bar很難解開。首先,把它變成一個積極的聲明。

return (undef) if ($#ret < 0); 

何時是$#ret < 0?當它是-1。 -1 $#RET是長度爲0的數組所以上面可以寫更加簡單的...

return (undef) if scalar @ret <= 0; 

但你不能有負長度的數組,所以...

return (undef) if scalar @ret == 0; 

和==是在標量環境,讓「標」是多餘的...

return (undef) if @ret == 0; 

但是,這是說「如果@ret是假的」的只是一個羅嗦的方式。

return (undef) if [email protected]; 

對於簡單語句修飾符,我認爲它更適合於用unless表達。

return (undef) unless @ret; 

難道不容易嗎?

作爲最後的附註,return undef不鼓勵,因爲它在列表上下文中做了錯誤的事情。你得到一個包含一個undef元素的列表,這是真的。相反,只需使用一個空白返回,它將在標量上下文中返回undef,並在列表上下文中返回一個空列表。

return unless @ret; 
2

總之大家一樣,該代碼是更易讀,如果這樣寫的:

my @ret = someMethod(); 
return if $DB_ERROR; 
return unless @ret;