2011-02-07 20 views
10

Kasa blokları eşleşmediyse bir kod bloğu çalıştırmanın bir yolu var mı? Örneğin:Perl Anahtar Bildirimi

switch($a) { 

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

else sadece son durum bloğu için geçerlidir beri, aradığım şey değildir.

cevap

31

Tabii ki, eğer çalıştırıyorsanız, Perl 5.10'da her zaman anahtarlama vardır. yerini aldığı (ve sonraki perl sürümde kaldırıldı) zaten cevap olarak, bir switch ifadesinin perl kendi formu ile edilirken olarak

use feature qw(switch); 

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

Tüm belgeler: a "kullanmak" ifadesi istediğiniz sözdizimi dayalı sürüm numarasını içerecek şekilde http://perldoc.perl.org/perlsyn.html#Switch-statements – RickF

+0

İhtiyaç olarak iyi. Kullanım dışı bırakma/kaldırma ipucu için – SMT

1

Eğer use Switch kullandığınız varsayarsak, sizin aradığınızı

5

else gerçekten de bir else maddesini kullanabilir.

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

yukarıda olur $n=3 için çıkış "diğer" $n=1 için "bir".

3

"Başka son durum bloğu için geçerlidir beri, aradığım şey değildir."

sürece düşüş-through kullanmıyorsanız olarak:

use Switch 'fallthrough'; 

Sen güvenlidir.

Son durum bildirgesine ulaşırsanız, yukarıdaki durum bildirimlerinin hiçbiri bu ölçütlerle eşleşmediği anlamına gelir. Diğer bir deyişle (eğer herhangi bir düşüş yoksa), diğer tüm ifadeler sadece durum bildirimlerini yerine getiremediğinde yürütülür.

10

herhangi bir biçimde bu use Switch unutmayın itiraz edildi:

use feature qw(switch); 

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

Varsayılan durumu kullanmak istediğiniz sonucu elde eder. Ayrıca, bir koşul doğru olarak değerlendirildikten sonra anahtarın değerlendirilmesinin durmasını istiyorsanız, last'u kullanmayı da unutmayın.

+2

+1 – daxim

+0

Verilen/sonradan deneysel olarak kabul edildiğine dikkat edin. Tabii ki, "hiçbir uyarı" deneysel "ekleyerek uyarılardan kurtulabilirsiniz; Beyan. Http://perldoc.perl.org/functions/given.html sayfasına bakın. – Nagev

1

sadece karar vermek gerekirse bir atama Ben genellikle daha basittir aşağıda blok yapısı ve bir şey ithal etmeye ihtiyacı kullanmak üçlü operatöre ?:

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

kullanın.

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

Bu ifade dönüş Durum 2:

my $test = 'abcd'; 

print test($test); 

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

Bu, bir dönüş Vaka 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; 

Bu seferki Durum 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; 

Standart:

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

yazdım ve bu üç Perl altprogram anahtarları kullanmak ve onları çok yararlı buluyorum.

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; 
} 
anahtarı özelliğini