在php中我可以堆栈case语句,我可以用perl做等价的吗?
switch($myValue)
{
case "one":
case "two":
break;
case "three":
break;
default:
break;
}
答案 0 :(得分:14)
Switch statements是使用given
和when
构造实现的。由于传递给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)
以下内容对我有用: