Perl Mason中的Switch-Case语法

Perl Mason中的Switch-Case语法,perl,switch-statement,mason,Perl,Switch Statement,Mason,我正在寻找Mason中的switch-case语法,但还没有找到 有人能帮我拿一个样品吗 提前感谢。Perl直到最近才有switch/case语句 您可以使用该模块 或者使用Perl5.10中提供的Perl6 例如: use v5.10.1; given ($var) { when (/^abc/) { $abc = 1 } when (/^def/) { $def = 1 } when (/^xyz/) { $xyz = 1 } default {

我正在寻找Mason中的switch-case语法,但还没有找到

有人能帮我拿一个样品吗


提前感谢。

Perl直到最近才有switch/case语句

您可以使用该模块

或者使用Perl5.10中提供的Perl6

例如:

use v5.10.1;

given ($var) {
    when (/^abc/) { $abc = 1 }
    when (/^def/) { $def = 1 }
    when (/^xyz/) { $xyz = 1 }
    default       { $nothing = 1 }
}

Saket,以下在我的Mason系统上运行良好。它是
HTML::Mason
ver。1.48在Perl 5.14和Apache 2.2.22上运行

在Perl
5.10.1
之后提供了类似开关的语句
,(),Matteo的另一篇文章已经指出了这一点

test.html
(如果服务器配置需要,请重命名为
test.mas


但是,对于只依赖于固定键的开关来说,最简单的“等价物”当然是
%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>

%我的$name='Wittig';
你好这是你的吗?
我的%NameSword=(
Luno=>Fingal,
Ecke=>“Eckesax”,
Artus=>“神剑”,
Wittig=>“Mimung”,
Ortnit=>“Rosen”,
Sigurd=>Gram,
Siegmund=>Notung,
齐格弗里德=>巴尔芒,
迪特里希=>'Nagelring'
);

这三种变体产生相同的输出。可能是我把剑的名字弄混了(必要时会更正)。

如果您想用Perl编写一个switch语句,请将
#switch$var
放在逻辑块的开头。这只是表示您只打算对一个变量执行逻辑。对于每种情况后中断的典型情况,可以使用
if-elsif-else
block

$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

在Perl 5.10.1上,given/when对我来说很好。下面是我用来测试的示例组件:

% 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>
%my$value=2;
%给定值($value){
%何时(1){
是一个,亲爱的
%     }
%何时(2){
二级
%     }
% }
%
使用v5.10.1;

如果我将$value设置为1,则得到h1部分;将其设置为2将得到h2部分。

我相信这是纯Perl代码的结果,而不是mason。我试着用在梅森身上,但没有成功。你会有一个梅森样本,但是你可以在HTML中嵌入Perl代码。您可以在
部分中使用switch语句。你也许应该编辑你的问题,并举例说明你想做什么。是的,这就是我正在做的……但看起来mason不太理解“use”语句,因此也不太理解switch语法fails@Saket如果您提供了错误消息以及导致错误的代码的上下文,我们可以帮助诊断梅森错误。现在我面前有大量的mason代码,如果您的“使用”状态不在专门针对perl代码的块中(init shared、perl等),那么是的,mason在读取它时会吐在上面。我主要将我的文件放在%init中,但我也在%filter块中有一个。Switch.pm是Perl 5.8.0引入的。它已从Perl 5.14中删除。应该改用given/when(由Perl 5.10.0引入)。given/when语句用于替换Switch.pm。Switch.pm是源过滤器,因此不建议用于生产代码。Switch.pm已从Perl 5.14的标准Perl发行版中删除。您仍然可以从CPAN获得它,但建议您不要这样做。
$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
$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
% 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>