【问题标题】:Switch-Case syntax in MasonMason 中的 Switch-Case 语法
【发布时间】:2012-07-18 05:07:15
【问题描述】:

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

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

提前致谢。

【问题讨论】:

    标签: perl switch-statement mason


    【解决方案1】:

    如果要在 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
    

    【讨论】:

      【解决方案2】:

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

      类似 switch 的语句 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 handcpan 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>
      

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

      【讨论】:

      • 引入了 given/when 语句来替换 Switch.pm。 Switch.pm 是一个源过滤器,因此不推荐用于生产代码。 Switch.pm 已从 Perl 5.14 的标准 Perl 发行版中删除。您仍然可以从 CPAN 获得它,但建议您不要这样做。
      【解决方案3】:

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

      您可以使用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 }
      }
      

      【讨论】:

      • 我相信这是纯 Perl 代码,而不是 mason。我尝试在梅森中使用它,但没有成功。你有石匠样品吗
      • 但是你可以在 HTML 中嵌入 Perl 代码。您可以在 &lt;%perl&gt; 部分中使用您的 switch 语句。您也许应该编辑您的问题并举例说明您想要做什么。
      • 是的,这就是我正在做的......但看起来 mason 不太理解 'use' 语句,因此 switch 语法失败
      • @Saket 如果您证明了错误消息,以及导致错误的代码上下文,我们可以帮助诊断 mason 错误。我现在面前有大量的梅森代码,如果你的“使用”语句不在专门用于 perl 代码(init shared、perl 等)的块中,那么是的,梅森会吐在上面当它读取它时。我主要把我的放在 %init 中,但我也有一个放在 %filter 块中。
      • Switch.pm 是在 Perl 5.8.0 中引入的。它已从 Perl 5.14 中删除。您应该改用 given/when(Perl 5.10.0 引入)。
      【解决方案4】:

      在 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 部分。

      【讨论】:

        猜你喜欢
        • 2021-06-13
        • 2013-09-24
        • 1970-01-01
        • 2016-06-27
        • 2016-01-18
        • 2015-11-25
        • 1970-01-01
        • 1970-01-01
        • 2015-08-13
        相关资源
        最近更新 更多