2012-05-08 96 views
5

我在評估某些變量是否與期望值匹配。這些變量是通過某個程序在內存中設置的,其值可以通過自定義程序從shell訪問。Perl單線程if else邏輯

我將shell命令的輸出傳遞給awk以獲取我想要的特定字段,然後我想通過perl運行它以查看它是否與期望值匹配。例如,

ysgrp autostart | awk -F\: '{print $1}' | perl -e 'print {"True"} else {print "False"} if /on/' 

但是,我收到來自perl關於「} else」附近的編譯錯誤的抱怨。如何在perl單線程中處理if/then/else邏輯?

回答

12

你不能在後綴條件中使用else條件。您可以使用三元條件運算符是這樣的:

perl -e 'print /on/ ? "True" : "False"' 

或者使用明確的塊這樣的:

perl -e 'if (/on/) { print "True" } else { print "False" }' 
1

一個沒有,除了使用三元運算符?:; foo if bar語法不支持else

+1

我想你的意思** **三元操作; O) – phuzi

+0

葉,試圖在一次 – geekosaur

+0

做太多的事情,我不知道這有許多計算機語言多個三元運營商;該語法太討厭解析。 – geekosaur

1

你可以這樣做:

... | perl -ne 'print /on/ ? "True" : "False"' 

但請不要!你會做得更好:

... | grep -qF on && echo True || echo False 
+0

這個答案是最好的,因爲增加了「n」標誌。沒有它,匹配將無法按預期工作。 –

3

這一部分:

awk -F\: '{print $1}' | perl -e 'print {"True"} else {print "False"} if /on/' 

可以用perl來處理(如果我請記住awk正確):

perl -F/:/ -lane 'print $F[0] =~ /on/ ? "True" : "False"' 

請注意使用-n開關,沒有它,您的perl單行程將不起作用。還要注意-l開關,它爲您的打印添加了一個換行符,這是我想要的。否則,你的輸出就會是這樣的:

TrueTrueTrueFalseTrueFalse 
+0

'-F:'就夠了。 – ikegami

+0

我意識到OP沒有以換行符結束,但那不是真的。我會用'perl -F:-lane'...'' – ikegami

+0

@ikegami 1:真的,2:我知道,只是修好了。 – TLP