2013-07-31 34 views
0

我想通過只使用if操作符在perl中創建一些類似bash的case語句。perl中的字符串變量的多重比較

my $var = shift @ARGV; 
print "err\n" if (!$var || ($var ne "one") || ($var ne "two")); 

問題是,'if'語句無法按預期工作。例如,如果我通過輸入'one'或'two'打印'err',但是,如果我用'eq'替換'ne'腳本,則工作正常。

Perl版本5.16.3 Linux的

+0

你能說清楚預期的行爲是什麼嗎?除了「一」和「二」之外,是否允許所有真值?或者*只允許「一」或「二」嗎? – amon

+0

只有當參數未定義,或者不是'one'或'two'時,代碼必須返回'err'。否則根本沒有輸出。 – Theodor

回答

2

閱讀上De Morgan’s laws

not($p && $q) == (!$p || !$q) 
not($p || $q) == (!$p && !$q) 

如果只允許值是"one""two",那麼你可以寫:

print "err\n" 
    unless defined $var 
    and $var eq "one" || $var eq "two"; 

如果您想用ne,那麼:

print "err\n" 
    if ! defined $var 
    or $var ne "one" && $var ne "two"; 

這兩種形式是等價的。如果有兩個以上的允許的字符串,它就會採用哈希更容易,更高效:

my %allowed; 
@allowed{"one", "two"} =(); 

print "err\n" unless defined $var and exists $allowed{$var}; 

與您的代碼的問題是:或-ING多個條件。當在一起,就足夠了任何一個子條件對於整個條件都是正確的。

給定undef或其他虛假值,!$var爲真。
給定字符串"one"$var ne "two"爲真。
給定任何其他字符串,$var ne "one"爲true。

因此,總是如此。