2012-01-31 231 views
4

我試圖在我的腳本中編寫更高效的代碼,並且有時一直在實現三元條件運算符。我不明白爲什麼我使用的三元條件運算時在一個循環中獲得一個附加的結果:Perl三元條件運算符

#!/usr/bin/perl 

use strict; 
use warnings; 

my @array = ('Serial = "123"', 'Serial = "456"', 'Serial = "789"'); 
my ($test1,$test2); 
foreach my $a (@array){ 
     !$test1 ? $test1 = $a : $test1 .= " AND " . $a; 
} 
foreach my $b (@array){ 
     if (!$test2) { 
       $test2 = $b 
     } else { 
       $test2 .= " AND " . $b; 
     } 
} 
print "Test1: $test1\n"; 
print "Test2: $test2\n"; 

輸出:

~/bin/test.pl 
Test1: Serial = "123" AND Serial = "123" AND Serial = "456" AND Serial = "789" 
Test2: Serial = "123" AND Serial = "456" AND Serial = "789" 

測試1輸出具有附加的「串行=‘123’,我究竟做錯了什麼?

+2

三元條件運算符不會使您的代碼更高效。它使*不易讀*。我甚至不知道在'。='運算符的左側是否有嵌入式賦值的三態條件運算符意味着什麼,更不用說它是否能正常工作。 – 2012-01-31 06:06:06

+3

你爲什麼要以一種奇怪的方式重新實現['join'](http://perldoc.perl.org/functions/join.html)? – 2012-01-31 06:25:57

回答

7

分配比?下precendence這

!$test1 ? $test1 = $a : $test1 .= " AND " . $a; 

是相同的:

(!$test1 ? $test1 = $a : $test1) .= " AND " . $a; 

所以首先$test1將成爲Serial = "123"然後AND Serial = "123"得到後立即追加。

試試這個:

!$test1 ? ($test1 = $a) : ($test1 .= " AND " . $a); 

一個更好的解決辦法是這樣的:

$test1 = !$test1 ? $a : $test1 . " AND " . $a; 

使用副作用三元運營商可以得到相當混亂和我建議,以避免它。

編輯

正如MuIsTooShort join(' AND ', array)注意的是,你的情況是最簡明易讀的解決方案。

+5

'join('AND',@array)'會更好...... – 2012-01-31 06:24:20

3

您遇到優先問題。你可以看到的Perl是如何解釋(即理解)使用Deparse

perl -MO=Deparse,-p -e "!$test1 ? $test1 = $a : $test1 .= q{ AND } . $a;" 

-p告訴Deparse就擺在很多括號的,所以你可以看到什麼是表達了起來:

(((!$test1) ? ($test1 = $a) : $test1) .= (' AND ' . $a)); 

所以在這裏你可以看到這行代碼並不意味着你的意圖。

像這樣使用?:的風格相當糟糕,不會讓事情變得更快。

0

在你的循環

my ($test1,$test2); 
foreach my $a (@array){ 
     !$test1 ? $test1 = $a : $test1 .= " AND " . $a; 
} 

第1次$test1將是:Serial = "123" AND Serial = "123"

第2次:Serial ="123" AND Serial = "123" AND Serial = "456"

3:Serial "123" AND Serial = "123" AND Serial = "456" AND Serial = "789"

4HT:測試1:Serial = "123" AND Serial = "123" AND Serial = "456" AND Serial = "789"

9

首先,你有一個優先問題。

!$test1 ? $test1 = $a : $test1 .= " AND " . $a; 

裝置

(!$test1 ? $test1 = $a : $test1) .= " AND " . $a; 

它可以與括號來解決。

my $test1; 
for (@array) { 
    !$test1 ? ($test1 = $a) : ($test1 .= " AND " . $a); 
} 

但這是不可讀的。你顯然走錯了方向!有兩項任務正在執行中,並且您正試圖將它們組合成一個。簡單地將它們分開使得代碼更具可讀性。

my $test1; 
for (@array) { 
    $test1 .= ' AND ' if $test1; 
    $test1 .= $_; 
} 

但是我們還沒有。讓我給你介紹一下join

my $test1 = join(' AND ', @array); 

好多了!

最後,它看起來像你在建立一個SQL語句。如果是這樣,你的問題是沒有意義的,因爲你應該使用佔位符將數據傳輸到數據庫。在該文檔中搜索DBI文檔。

+0

+1整整十碼,然後一些! – Zaid 2012-01-31 06:35:55

2

三元運算符是偉大的情況下,當Z = X OR Y

在這裏你不是那麼做的。發生什麼事是你從數組中構建一個字符串。這就是join函數的全部內容。

my $test = join ' AND ', @array; 

現在更有效的編碼。