lur*_*rks 27 perl switch-statement
在Perl 5中是否有一种简洁的方法来制作case或switch语句?在我看来,他们应该在版本6上包含一个开关..
我在脚本中需要这个控制结构,我听说你可以导入一个"开关模块".但是如何在没有导入的情况下实现它以最小化依赖性并获得可移植性?
Cha*_*ens 57
如果您使用的是Perl 5.10,那么given
/when
它是一个switch语句(注意,它可以做的不仅仅是与正则表达式进行比较,请阅读链接的文档以了解它的全部潜力):
#or any of the dozen other ways to tell 5.10 to use its new features
use feature qw/switch/;
given($string) {
when (/^abc/) { $abc = 1; }
when (/^def/) { $def = 1; }
when (/^xyz/) { $xyz = 1; }
default { $nothing = 1; }
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Perl 5.8或更早版本,则必须使用if
/ elsif
/ else
语句:
if ($string =~ /^abc/) { $abc = 1; }
elsif ($string =~ /^def/) { $def = 1; }
elsif ($string =~ /^zyz/) { $xyz = 1; }
else { $nothing = 1; }
Run Code Online (Sandbox Code Playgroud)
或嵌套条件运算符(?:
):
$string =~ /^abc/ ? $abc = 1 :
$string =~ /^def/ ? $def = 1 :
$string =~ /^xyz/ ? $xyz = 1 :
$nothing = 1;
Run Code Online (Sandbox Code Playgroud)
Core Perl(Switch)中有一个模块通过源过滤器为您提供虚假的switch语句,但我理解它很脆弱:
use Switch;
switch ($string) {
case /^abc/ {
case /^abc/ { $abc = 1 }
case /^def/ { $def = 1 }
case /^xyz/ { $xyz = 1 }
else { $nothing = 1 }
}
Run Code Online (Sandbox Code Playgroud)
或替代语法
use Switch 'Perl6';
given ($string) {
when /^abc/ { $abc = 1; }
when /^def/ { $def = 1; }
when /^xyz/ { $xyz = 1; }
default { $nothing = 1; }
}
Run Code Online (Sandbox Code Playgroud)
Nat*_*man 17
Programming Perl中的建议是:
for ($string) {
/abc/ and do {$abc = 1; last;};
/def/ and do {$def = 1; last;};
/xyz/ and do {$xyz = 1; last;};
$nothing = 1;
}
Run Code Online (Sandbox Code Playgroud)
我喜欢的等效解决方案是调度表.
my $switch = {
'case1' => sub { print "case1"; },
'case2' => sub { print "case2"; },
'default' => sub { print "unrecognized"; }
};
$switch->{$case} ? $switch->{$case}->() : $switch->{'default'}->();
Run Code Online (Sandbox Code Playgroud)