2012-07-22 19 views
1

時使用OR(一般邏輯運算符)時遇到問題基本上我想獲得用戶輸入並決定要做什麼,並且即使對於不同的用戶輸入有時也需要相同的結果。示例代碼:Perl Switch語句:在給定條件/當條件爲

given ($command) { 
     when ('a' || 'add') {add} 
     when ('s' || 'subtract') {subtract} 
     when ('m' || 'multiply') {multiply} 
     when ('d' || 'divide') {divide} 
     default { print "try again, usage: add, subtract, multiply, divide (a, s, m, d)\n" } 

現在麻煩的是,它只有在我在or語句的開頭鍵入單個字母命令時才起作用。如果我在提示中鍵入類似「添加」的內容,我會收到默認消息,告訴我再試一次。

我可以爲這些做單獨的情況,但它只是與單個字母相同,這只是多餘的。

回答

4

given/when構造使用智能匹配運算符,它對||運算符沒有任何特殊情況的行爲。表達

'a' || 'add' 

計算結果爲'a',所以它只是匹配$command對字符串'a'

如果你想匹配$command反對任何值的列表,你可以使用一個數組值:(像往常一樣,有幾種方式來表達這一點)

given ($command) { 
    when ([qw(a add)]) { add } 
... 

參考:

perldoc -f given

perldoc perlsyn;搜索「開關語句」和「智能匹配詳細」。

編輯:

對於這個問題的另一種方法,如果你想允許$command是命令名稱的任何前綴(如"s""su""sub",...,"subtract")是一樣的東西這樣的:

sub match { 
    my($s, $target) = @_; 
    return index($target, $s) == 0; 
} 

... 

if (match($command, 'add') { ... } 
elsif (match ($command, 'subtract') { ... } 
... 
+0

非常感謝答案,你說得對,我沒有意識到這是一個數組:) – 2012-07-22 08:18:51

+0

@ AJ_507:我已經編輯我的答案顯示另一個做法。 – 2012-07-22 08:23:37

+2

有一個特殊情況(對於'when',而不是smartmatch)記錄,但AFAICT似乎不起作用。這是http://perldoc.perl.org/perlsyn.html#Experimental-Details-on-given-and-時的情況10 – ysth 2012-07-22 09:31:37

2

你只是使用了錯誤的synthax,嘗試了這種方式:

#!/usr/bin/perl 

use 5.012; 
use warnings; 

print 'Enter your command : '; 
chomp(my $command = <>); 

given ($command) { 
     say 'Adding something' when ['a', 'add']; 
     say 'Subtracting something' when ['s', 'subtract']; 
     say 'Multiplying something' when ['m', 'multiply']; 
     say 'Dividing something' when ['d', 'divide']; 
     default { say "try again, usage: add, subtract, multiply, divide (a, s, m, d)\n" } 
} 
0

「何時」評估正則表達式。

您不能使用||但你可以使用正則表達式:)

given ($command) { 
    when (/(^a$|^add$)/) { 
     .... 
    } 
    .... 
}