2012-05-31 115 views
3

此代碼是if語句;我想測試$rtgene是否包含trn。 我測試了$rtgene= nad3代碼:Perl如果語句混淆

if ($rtgene!~/trn/){ 
$end=$data[$i][0]+100; 
} 
else{ 
$end =$data[$i][1]; 
} 
print $end; 

這是另一種表達不工作:

($rtgene!~/trn/)? $end=$data[$i][0]+100 : $end=$data[$i][1]; print $end; 

的問題是在第一代碼(正常的,如果else語句),它的工作原理,並給我預期的結果,但另一個(最後一行)它不工作;它總是執行else語句。

問題:這個問題的原因是什麼?如何解決它?

+0

我相信@ ysth的回答是正確的。除此之外,爲什麼不使用if/else語句呢?您使用'?:'運算符會獲得什麼好處?你也可以考慮扭轉這種狀況;在if/else語句中使用'!〜'這樣的負面條件可能會造成混淆。 –

回答

5

既然你正試圖根據條件分配兩個值中的一個$end,爲什麼不寫條件表達式這樣的:

$end = ($rtgene !~ /trn/) ? $data[$i][0]+100 : $data[$i][1]; 
print $end; 

這避免優先問題通過ysth準確診斷,並且比較容易理解。

Perl可以用來編寫不可思議的代碼;儘管如此,讓所有代碼難以理解並不是一個好主意。將作業堆疊起來並打印在一條線上趨於不可思議。

3

對我來說看起來像是一個優先錯誤。 =具有比低優先級:?,所以它是這樣的:

(($rtgene!~/trn/) ? $end=$data[$i][0]+100 : $end) = $data[$i][1]; 

即,三元的任一分支分配$data[$i][1]$end(儘管真實分支第一分配另一個值,該值最終被覆蓋)。

試試這個:

($rtgene!~/trn/) ? ($end = $data[$i][0]+100) : ($end = $data[$i][1]); 
+6

或者,您可以將它短語作爲'$ end =($ rtgene!〜/ trn /)? $ data [$ i] [0] +100:$ data [$ i] [1]' – stevenl

+2

@stevenl說的。 「?:」的重點在於它是一種表達,而不是一種表述;它有一個價值,所以你應該使用它。否則,只要使用'if' /'else'就會更清楚。 –

4

下面是使用三元條件運算方式:

$end = $rtgene !~ /trn/ ? $data[$i][0]+100 : $data[$i][1]; 

它評估?之前的部分,然後返回第一個選項,如果這是真的,否則返回第二個。