2011-02-07 14 views
10

¿Hay alguna forma de ejecutar un bloque de código si ninguno de los bloques de casos coincide? Por ejemplo:Perl Switch Statement

switch($a) { 

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

else no es lo que estoy buscando, ya que sólo se aplica al último bloque caso.

Respuesta

31

Siempre está el cambio en Perl 5.10, si lo está ejecutando, por supuesto.

use feature qw(switch); 

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

la documentación completa sobre la función del interruptor: http://perldoc.perl.org/perlsyn.html#Switch-statements – RickF

+0

necesidad de incluir un número de versión en "uso" declaración basada en la sintaxis que desee, bien. – SMT

1

Suponiendo que está usando use Switch, puede utilizar una cláusula else

5

else es precisamente lo que busca.

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

lo anterior sería salida "otro" para $n=3 y "uno" para $n=1.

3

"lo demás no es lo que estoy buscando, ya que sólo se aplica al último bloque caso".

Mientras usted no está utilizando de paso al siguiente:

use Switch 'fallthrough'; 

que son seguros.

Si llega al último enunciado de caso, significa que ninguno de los enunciados de casos anteriores coincide con los criterios. En otras palabras (si no hay una falla), la instrucción else solo se ejecuta si todas las declaraciones de casos no satisfacen sus condiciones.

10

Tenga en cuenta que use Switch en cualquier forma es obsoleto ya que está siendo reemplazado (y eliminado en la próxima versión de Perl) por propia forma de Perl de instrucción switch, que es, como ya se ha contestado:

use feature qw(switch); 

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

El uso del estuche predeterminado logra el resultado que desea. Además, no olvide utilizar last si desea que el interruptor deje de evaluarse después de que una condición se evalúe verdadera.

+2

+1 para la pista de obsolescencia/eliminación – daxim

+0

Tenga en cuenta que, dado/cuándo, se consideró más experimental. Por supuesto, puedes deshacerte de las advertencias agregando un "sin advertencias" experimental "; declaración. Ver http://perldoc.perl.org/functions/given.html – Nagev

1

Si sólo necesita decidir una asignación utilizar el operador ternario ?:

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

que suelen utilizar el constructo bloque debajo de la cual es más sencilla y sin necesidad de importar nada.

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

Esta instrucción de retorno Caso 2:

my $test = 'abcd'; 

print test($test); 

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

Ésta retorno Caso :

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

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

print $result; 

Ésta Caso 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; 

defecto:

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

escribí y utilizar estos tres interruptores de subrutinas Perl y los encuentran muy útil.

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; 
}