2010-05-27 53 views
1

我有兩個Perl的一個套:如何在Perl中結合兩個條件?

perl -pe "s/\b$a\b/$b/g if m/param1 /" test 

perl -pe "s/\b$a\b/$b/g unless /^#/" test 

我怎樣才能結合if m/somthing/unless /something/,如:

[[email protected] tmp]# perl -pe "s/\b$a\b/$b/g if m/param1/ unless /^#/" test 
syntax error at -e line 1, near "m/param1/ unless" 

回答

0

在一個不相關的音符,你可能要添加周圍$a\Q and \E轉義序列中您正則表達式:

perl -pe "s/\b\Q$a\E\b/$b/g if m/param1 /" test 

他們逃脫類的特殊正則表達式的任何字符。如果你打算讓$a持有一個正則表達式,你應該把字邊界斷言(\b)移入它。

無論您選擇做什麼,您都需要小心$a$b中的值。例如:

a="/" 
b="slash" 
perl -pe "s/\b\Q$a\E\b/$b/g if m/param1 /" test 

將導致語法錯誤。對此的一個解決方案是不使用環境變量來替換代碼。 Perl中,您可以通過%ENV哈希訪問環境:

perl -pe 's/\b\Q$ENV{a}\E\b/$ENV{b}/g if m/param1 /' test 

注意使用單蜱,以避免治療$ENV作爲一個shell變量。

3

也許

perl -pe "s/\b$a\b/$b/g if m/param1/ && ! /^#/" test 

做到了。

2

unlessif not相同。通過你寫的聲明的方式來看,我猜你指的是以下幾點:

perl -pe "s/\b$a\b/$b/g if m/param1/ and not /^#/" test 

(雖然,你可能意味着or代替and?)

+0

另請注意,它更好地使用&&而不是'和'。 '和'的優先級低於&& – 2010-06-07 17:06:24