PHPでは、私はcase文をスタックできますが、perlと同等のことはできますか? Perlでperlスタッキングスイッチケースステートメント
switch($myValue)
{
case "one":
case "two":
break;
case "three":
break;
default:
break;
}
PHPでは、私はcase文をスタックできますが、perlと同等のことはできますか? Perlでperlスタッキングスイッチケースステートメント
switch($myValue)
{
case "one":
case "two":
break;
case "three":
break;
default:
break;
}
Switch statements> = 5.10given
とwhen
構築物を使用して実装されています。これは、given
に渡された値のスマートマッチングのために非常に柔軟です。
use feature qw(switch);
use strict;
use warnings;
given ($value) {
when ([qw/one two/]) {
# do something
}
when ('three') {
# do some other thing
}
default {
# default to something
}
}
あなたもwhen (/one|two/)
としてwhen ([qw/one two/])
を書くことができます。 Perlの< 5.10で
上付き文字をうまく使います。 :) –
、することができますハッシュでsubrefsとそれ偽:それは怪しげな機能だが、
my %switch = (
foo => sub { do_something() },
bar => sub { do_something_else() },
);
exists $switch{$check_var} ? $switch{$check_var}->() : do_the_default_case();
それはあなたが落ちるスルー与えるものではありません(無ダフのデバイス)。 Perlで
これは、デフォルトのオプションをサポートしているか、またはスイッチの値が一致していないかのように見えません(この例の 'baz'は問題を引き起こします)。それはできる最善のことがあります。 –
@Jonathan Lefflerデフォルトのオプションは、 'if'ステートメントまたは条件演算子によって実現されます。ディスパッチテーブルを使用するときに存在チェックを追加することは、たとえすべてがエラーメッセージで「死んでいる」場合でも、常に良い考えです。 –
、それは次のようになります
use 5.010;
given($myValue)
{
when ([qw<one two>]) { say; }
when ("three") { say "I'm $_"; }
default { say qq{DEFAULT for "$_"}; }
}
、それをテストする:
use 5.010;
foreach my $myValue (qw<one two three four>)
{
given($myValue)
{
when ([qw<one two>]) { say; }
when ("three") { say "I'm $_"; }
default { say qq{DEFAULT for "$_"}; }
}
}
そして、印刷:
one
two
I'm three
DEFAULT for "four"
Perlが別のタイプ可能転倒の原因は、continue
です。しかし、の基準は両方ともの場合を満たさなければならない。このように:それは$s ~~ 'one' && $s ~~ 'two'
ケースになることはありませんので、
given($myValue)
{
when ('one') { say 'one!'; continue; }
when ('two') { say 'two!'; }
}
は、意味がありませんが、あなたは後者の場合行った場合:
when (/\bo|o\b/) { say q/has 'o'!/; }
をフォールスルー条件が真であることが可能です。 1つの警告:default
にすべて従っているので、default
のケースがある場合は、何も残っていなければ続行します。 continue
「OK、今他の述語が適用されるものを探す」と思われるようです。
私は、これは「並べ替えの演算子」のように誤って見えますが、実際には「もう一度見える」演算子だからです。
あなたの場合フォールスルーする必要、あなたは(OPの例ではbreak
文を省略することによりなど)が明示的に
given($foo) {
when (/x/) { say '$foo contains an x'; continue }
when (/y/) { say '$foo contains a y' }
default { say '$foo does not contain a y' }
}
ではなく、暗黙的に行うことができますcontinue
文は、そこにあります。
サンプルをperlsynから抜き取りました。
次は私のために働いている:
Switch.pmはおすすめしません。これはソースフィルタであり、厄介な微妙なバグにつながる可能性があります。 Perl 5.10で追加された/ when構文ははるかに安全です。 –
多くの企業が5.10より下のバージョンを実行し、書き込まれているものが単純な雑用スクリプトであれば、Switch.pmは簡単なソリューションです。 –
さて、これらの企業がある時点で、より最近のバージョンのPerlにアップグレードすることを願っています:-)しかし、とにかく、Switch.pmはソースフィルタです。つまり、純粋なプログラマが生産コード。 –
あなたは(http://perldoc.perl.org/Switch.html#Allowing-fall-through)[フォールスルーを許可する]を意味するのですか? – Mike
@Mike:Switch.pmは実験だったが、今はとても後悔している。 – ysth