我正在寻找Mason中的switch-case语法,但一直找不到。
有人可以在这里协助您提供样品吗?
提前致谢。
答案 0 :(得分:0)
如果要在Perl中创建switch语句,请将#switch $var
放在逻辑块的开头。这只是为了表明你打算只对一个变量做逻辑。对于每个案例后的休息的经典案例,您可以使用if elsif else
块。
$var = 3;
# switch $var
if ($var == 1) {print "one\n"; }
elsif($var == 2) {print "two\n"; }
elsif($var == 3) {print "three\n"; }
elsif($var == 4) {print "four\n"; }
else {print "didn't get it\n"; } #default
如果您打算使用fall through和default,那么它会更复杂,更慢。
$var = 3;
$got = 0;
# switch $var
if ($var == 1) {print "one\n"; ++$got;}
if ($var == 2) {print "two\n"; ++$got;}
if ($var == 3) {print "three\n"; ++$got;}
if ($var == 3
|| $var == 4) {print "three or four\n"; ++$got} #fall-through
unless ($got) {print "didn't get it\n"; } #default
答案 1 :(得分:-1)
直到最近,Perl还没有切换/案例声明
您可以使用Switch模块
use Switch;
switch ($val) {
case 1 { print "number 1" }
case "a" { print "string a" }
case [1..10,42] { print "number in list" }
case (\@array) { print "number in list" }
case /\w+/ { print "pattern" }
case qr/\w+/ { print "pattern" }
case (\%hash) { print "entry in hash" }
case (\&sub) { print "arg to subroutine" }
else { print "previous case not true" }
}
或使用Perl 5.10提供的Perl 6的given/when
constructs
示例:
use v5.10.1;
given ($var) {
when (/^abc/) { $abc = 1 }
when (/^def/) { $def = 1 }
when (/^xyz/) { $xyz = 1 }
default { $nothing = 1 }
}
答案 2 :(得分:-1)
Saket,以下在我的Mason系统上工作正常。它是HTML::Mason
ver。 1.48在Perl 5.14和Apache 2.2.22上运行。
类似于交换机的语句given
/ when
在Perl 5.10.1
之后可用,( see here ),正如已经指出的那样在Matteo的另一篇帖子中。
test.html
(如果您的服务器配置需要,请重命名为test.mas
。)
<html>
<head></head>
<body>
% my $name = 'Wittig';
<h3>Hello <% $name %>! Ist this your <% swordname($name) %>?</h3>
</body>
</html>
<%perl>
sub swordname {
my $hero = shift;
my $sword;
given($hero) {
when (/^Luno/) { $sword = 'Fingal' }
when (/^Ecke/) { $sword = 'Eckesax' }
when (/^Artus/) { $sword = 'Excalibur'}
when (/^Wittig/) { $sword = 'Mimung' }
when (/^Ortnit/) { $sword = 'Rosen' }
when (/^Sigurd/) { $sword = 'Gram' }
when (/^Siegmund/) { $sword = 'Notung' }
when (/^Siegfried/) { $sword = 'Balmung' }
when (/^Dietrich/) { $sword = 'Nagelring'}
default: { $sword = 'Sword' }
}
return $sword;
}
</%perl>
<%once>
use feature "switch";
</%once>
<小时/> 属于Perl核心模块before 5.14.0的模块
Switch.pm
(正如David Cross在评论中所述)确实提供了更“类似交换机”的语法,但使用了源过滤器。它可以在蜜蜂installed by hand(cpan install Switch
)之后使用,但不建议使用。可以使用Switch.pm
:重写该示例
<html>
<head></head>
<body>
% my $name = 'Wittig';
<h3>Hello <% $name %>! Ist this your <% swordname($name) %>?</h3>
</body>
</html>
<%perl>
sub swordname {
my $hero = shift;
switch($hero) {
case 'Luno' { return 'Fingal' }
case 'Ecke' { return 'Eckesax' }
case 'Artus' { return 'Excalibur'}
case 'Wittig' { return 'Mimung' }
case 'Ortnit' { return 'Rosen' }
case 'Sigurd' { return 'Gram' }
case 'Siegmund' { return 'Notung' }
case 'Siegfried' { return 'Balmung' }
case 'Dietrich' { return 'Nagelring'}
else { return 'Sword' }
}
}
</%perl>
<%once>
use Switch;
</%once>
但是,仅仅取决于固定密钥的交换机最简单的“等效”当然是%hash
:
<html>
<head></head>
<body>
% my $name = 'Wittig';
<h3>Hello <% $name %>! Ist this your <% $NameSword{$name} %>?</h3>
</body>
</html>
<%once>
my %NameSword = (
Luno => 'Fingal',
Ecke => 'Eckesax',
Artus => 'Excalibur',
Wittig => 'Mimung',
Ortnit => 'Rosen',
Sigurd => 'Gram',
Siegmund => 'Notung',
Siegfried => 'Balmung',
Dietrich => 'Nagelring'
);
</%once>
所有三种变体都产生相同的输出。也许我混淆了剑的名字(必要时会纠正)。
答案 3 :(得分:-1)
On Perl 5.10.1给出/什么时候适合我。这是我用来测试的示例组件:
% my $value=2;
% given ($value) {
% when (1) {
<h1>It is one, dear</h1>
% }
% when (2) {
<h2>Level two</h2>
% }
% }
%
<%once>
use v5.10.1;
</%once>
如果我将$ value设置为1,我会得到h1-part;将它设置为2可以得到h2-part。