Masonでswitch-case構文を探していますが、見つかりませんでした。
誰かがここでサンプルを手伝ってもらえますか?
前もって感謝します。
Masonでswitch-case構文を探していますが、見つかりませんでした。
誰かがここでサンプルを手伝ってもらえますか?
前もって感謝します。
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
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が得られます。
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>
Switch.pm
属していたモジュール(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>
3 つのバリアントはすべて同じ出力を生成します。たぶん私は剣の名前を混同しました(必要に応じて修正します).