-1

Masonでswitch-case構文を探していますが、見つかりませんでした。

誰かがここでサンプルを手伝ってもらえますか?

前もって感謝します。

4

4 に答える 4

0

Perl で switch ステートメントを作成する場合#switch $varは、論理ブロックの先頭に配置します。これは、1 つの変数に対してのみロジックを実行するつもりであることを示すためだけです。すべてのケースの後にブレークするという古典的なケースでは、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

フォールスルーとデフォルトを使用する場合は、より複雑で遅くなります。

$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

Perl5.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が得られます。

于 2012-07-18T16:58:11.227 に答える
-1

Saket さん、以下は私の Mason システムで問題なく動作します。版ですHTML::Mason。Perl 5.14 および Apache 2.2.22 で動作する 1.48。

スイッチのようなステートメントgiven/whenは、Perl5.10.1の後で使用できます (ここを参照)。これは、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>


5.14.0 より前の Perl コア モジュールにSwitch.pm属していたモジュール(David Cross がコメントで指摘したように) は、より「スイッチに似た」構文を提供していましたが、ソース フィルターを使用していました。手で取り付けた後も使用できますが( )、推奨されません。この例は、次を使用して書き直すことができます。cpan install SwitchSwitch.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 つのバリアントはすべて同じ出力を生成します。たぶん私は剣の名前を混同しました(必要に応じて修正します).

于 2012-07-18T11:49:05.683 に答える