-1

我正在寻找 Mason 中的 switch-case 语法,但一直找不到。

有人可以在这里帮忙提供样品吗?

提前致谢。

4

4 回答 4

0

如果要在 Perl 中创建 switch 语句,请将其放在#switch $var逻辑块的开头。这仅表明您打算仅对一个变量进行逻辑处理。对于每个 case 之后 break 的经典案例,您可以使用if elsif elseblock。

$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
于 2012-07-18T16:46:27.497 回答
-1

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

您可以使用开关模块

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结构

例子:

use v5.10.1;

given ($var) {
    when (/^abc/) { $abc = 1 }
    when (/^def/) { $def = 1 }
    when (/^xyz/) { $xyz = 1 }
    default       { $nothing = 1 }
}
于 2012-07-18T05:24:27.550 回答
-1

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

类似 switch 的语句given/when在 Perl 之后可用5.10.1,(请参阅此处),正如在 Matteo 的另一篇文章中已经指出的那样。

test.htmltest.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>


该模块Switch.pm属于5.14.0 之前的 Perl 核心模块(正如 David Cross 在评论中指出的那样),确实提供了更“类似开关”的语法,但使用了源过滤器。手动安装后仍可使用(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>

所有三个变体都产生相同的输出。也许我混淆了剑名(必要时会更正)。

于 2012-07-18T11:49:05.683 回答
-1

在 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 部分;将其设置为 2 给了我 h2 部分。

于 2012-07-18T16:58:11.227 回答