2011-02-07 90 views
10

如果沒有任何一個case塊匹配,是否有任何方法可以運行一段代碼?例如:Perl開關語句

switch($a) { 

    case // {} 
    case // {} 
    ... 
    # DO SOMETHING IF NONE OF THE ABOVE CASES WERE MATCHED 
} 

else不是我要找的,因爲它只適用於最後一種情況。您正在使用use Switch

回答

31

如果你正在運行它,那麼總是會在Perl 5.10中進行切換。

use feature qw(switch); 

given($a){ 
    when(1) { print 'Number one'; } 
    when(2) { print 'Number two'; } 
    default { print 'Everything else' } 
} 
+1

上的開關功能完整的文檔:http://perldoc.perl.org/perlsyn.html#Switch-statements – RickF 2011-02-17 13:57:18

+0

需要包括在「使用」的語句根據你想要的語法版本號,好。 – SMT 2013-02-02 18:26:20

1

假設,你可以使用一個else條款

5

else確實是你在找什麼。

switch ($n) { 
    case 1 { print "one\n" } 
    case 2 { print "two\n" } 
    else { print "other\n" } 
} 

上面會爲$n=3輸出 「其他」, 「一」 爲$n=1

3

「其他不是我要找的東西,因爲它只適用於最後一種情況。」

只要你不使用落空:

use Switch 'fallthrough'; 

你是安全的。

如果您到達最後一個case語句,則表示它上面沒有符合條件的case語句。換句話說(如果沒有經過的話)else語句只有在所有的case語句都不能滿足其條件時才被執行。

10

請注意,任何形式的use Switch,因爲它是被替換(並在未來的perl版本中刪除)由Perl的自己的形式switch語句,這是因爲已經回答被棄用:

use feature qw(switch); 

given ($x) 
{ 
when ('case1') { print 1; } 
default {print 0; } 
} 

使用默認案例可以實現您想要的結果。如果您希望在一個條件評估爲真後切換到停止評估,請不要忘記使用last

1

如果你只需要決定分配使用三元運算?:

die "Expecting name of the system (reise/synpac/vias) as parameter.\n" 
    unless $_ = shift; 
@opt{qw/Name Code Id UID/} = 
    /^\s*rei(?:se)?\s*$/i ? qw/ CEP REI 80 ipcp_rei/: 
    /^\s*syn(?:pac)?\s*$/i ? qw/ SYNPAC SYNPAC 67 ipcp_sym/: 
    /^\s*vias?\s*$/i  ? qw/ VIAS VIAS 68 ipcp_via/: 
    do { die "Unknown system ‘$_’.\n"; }; # or default values 
5

我通常使用下面的框結構,它是更簡單,不需要輸入任何東西。

SWITCH: { 
    if($key =~ /^abc/) { $key = "key starts with abc"; last SWITCH; } # 'last' breaks the 'SWITCH' block 
    if($key =~ /^def/) { $key = "key starts with def"; last SWITCH; } 
    if($key =~ /^ghi/) { $key = "key starts with ghi"; last SWITCH; } 
    $key = "Default value"; 
} 

print $key; 
0

此語句返回案例2

my $test = 'abcd'; 

print test($test); 

sub test { 
    for ($_[0]) { 
     /ad/ && return 'Case 1'; 
     /bc/ && return 'Case 2'; 
     /c/ && return 'Case 3'; 
    } 
} 

這一個回報案例3

my $test = 'abcd'; 
my $result; 

for ($test) { 
    /ad/ && do { $result = 'case 1' }; 
    /bb/ && do { $result = 'case 2' }; 
    /cd/ && do { $result = 'case 3' }; 
} 

print $result; 

這一個案例2

my $test = 'abcd'; 
my $result; 

for ($test) { 
    /ad/ && do { $result = 'case 1'; last }; 
    /bc/ && do { $result = 'case 2'; last }; 
    /cd/ && do { $result = 'case 3'; last }; 
} 

print $result; 

默認

my $test = 'abcd'; 
my $result; 

for ($test) { 
    /aa/ && do { $result = 'case 1'; last }; 
    /bb/ && do { $result = 'case 2'; last }; 
    /cc/ && do { $result = 'case 3'; last }; 

    $result = 'Default'; 
} 

print $result; 
0

我寫和使用這三個Perl子開關,並發現它們非常有用。

sub switchOne($){   # standard switch 
my($prefix,$testVal,@caseVals)[email protected]_; 
$s=0; 
    while($s<scalar(@caseVals)){ 
     if($testVal eq $caseVals->[$s]){ 
      return $prefix."_".$testVal; 
     } 
     $s++; 
    } 
return $prefix."Not"; 
} 

sub switchTwo($){   # test for 2 conditions switch = mapping x & Y 
my($prefix,$testVal1,$testVal2,@caseVals1,@caseVals2)[email protected]_; 
$s=0; 
    while($s<scalar(@caseVals)){ 
     if($testVal1 eq $caseVals1->[$s] && $testVal2 eq $caseVals2->[$s]){ 
      return $prefix."_".$testVal1; 
     } 
     $s++; 
    } 
return $prefix."Not"; 
} 

sub switchRange($){   # test for range switch 
my($prefix,$testVal1,@caseVals1,@caseVals2)[email protected]_; 
$s=0; 
    while($s<scalar(@caseVals)){ 
     if($testVal > $caseVals->[$s]&&$testVal < $caseVals2->[$s]){ 
      return $prefix."_".($s+1); 
     } 
     $s++; 
    } 
return $prefix."Not"; 
} 


############# here is the calling code 
$prefix="case"; 
@cases=(1,12,3,45,5,61,7,8,9,10);  # cases to test against/quote strings 
$case=&switchOne($prefix,$testvariable,\@cases); 

# prefix must be different for each switch call for different labels 
#duplicate labels can cause problems 

while($case ne ""){ 
    # initialization common code block 

    goto $case; 

case_1:    # cases in array 
    #code 
    last; 

case_12: 
    # code 
    last; 


case_61: 
    last; 
case_7: 
    last;  
case_8: 
    last; 
case_9: 
    last; 
case_10: 
    last; 

caseNot: 
    # no match comes here 

    #code 
    last; 
} 

# here is a dbl variable matching call example 
# prefix can be in the call quoted 
# both cases must be true to get a match 

$case=&switchTwo("intrsctn",$test1,$test2,\@cases1,\@cases2); 
while($case ne ""){ 
    # initial code as desired 
    goto $case; 

intrsctn_1: 
    # code 
    last; 

# as many labels as cases 

intrsctnNot: 
    last; 
} 

# here is a switch example to test for a variable in a range (between) 

$case=&switchRange("thscase",$testvariable,\@cases1,\@cases2); 
while($case ne ""){ 

     goto $case; 

thscase_1:  # this returns the array index +1 on the prefix 
    # code 
    last; 

# as many labels as cases 

thscaseNot: 
    # N must be uppercase 
    last; 
}