perl堆叠开关案例陈述

时间:2011-07-19 18:31:53

标签: perl

在php中我可以堆栈case语句,我可以用perl做等价的吗?

        switch($myValue)             
        {            
            case "one":
            case "two":
            break;
            case "three":
            break;
            default:
            break;
         }

5 个答案:

答案 0 :(得分:14)

Perl > = 5.10 中的

Switch statements是使用givenwhen构造实现的。由于传递给given的值的智能匹配,它非常灵活。

use feature qw( switch );
use strict;
use warnings;

given ($value) {
    when ( [qw/one two/] ) {
        # do something
    }
    when ('three') {
        # do some other thing
    }
    default {
        # default to something
    }
}

您甚至可以将when ( [qw/one two/] )写为when ( /one|two/ )

答案 1 :(得分:5)

在Perl中,那将是:

use 5.010;
given( $myValue )             
{            
    when ( [qw<one two>] ) { say; }
    when ( "three" )       { say "I'm $_";  }
    default                { say qq{DEFAULT for "$_"};  }
 }

并测试它:

use 5.010;

foreach my $myValue ( qw<one two three four> ) 
{
    given( $myValue )             
    {            
        when ( [qw<one two>] ) { say; }
        when ( "three" )       { say "I'm $_";  }
        default                { say qq{DEFAULT for "$_"};  }
     }
}

它打印出来:

one
two
I'm three
DEFAULT for "four"

Perl允许使用continue语句另一种类型的堕落。但必须满足两个案例的标准。因此:

given( $myValue )
{
    when ( 'one' ) { say 'one!'; continue; }
    when ( 'two' ) { say 'two!'; }
}

毫无意义,因为它永远不会是$s ~~ 'one' && $s ~~ 'two'的情况,但如果你做了第二种情况:

    when ( /\bo|o\b/ ) { say q/has 'o'!/; }

跌倒条件能够成立。需要注意的是:由于一切都符合default,如果你有一个default的情况,那么如果没有其他的话,继续会遇到它。 continue似乎说“好的,现在寻找其他谓词适用的内容。”

我之所以提到这一点,只是因为它看起来像一个“堕落的操作员”,但它确实是一个“再看”的操作员。

答案 2 :(得分:4)

Perl&lt; 5.10,你可以用散列中的subrefs伪造它:

my %switch = (
    foo => sub { do_something() },
    bar => sub { do_something_else() },
);
exists $switch{$check_var} ? $switch{$check_var}->() : do_the_default_case();

虽然这是一个可疑的功能,但它不会让你掉线(没有Duff的设备)。

答案 3 :(得分:1)

如果需要通过,则会有continue语句,您可以明确地执行此操作

given($foo) {
  when (/x/) { say '$foo contains an x'; continue }
  when (/y/) { say '$foo contains a y' }
  default    { say '$foo does not contain a y' }
}

而不是隐式(通过省略OP示例中的break语句)。

perlsyn剪下的示例。

答案 4 :(得分:-1)

以下内容对我有用:

use Switch;