2011-07-19 4 views
3

PHPでは、私はcase文をスタックできますが、perlと同等のことはできますか? Perlでperlスタッキングスイッチケースステートメント

 switch($myValue)    
     {    
      case "one": 
      case "two": 
      break; 
      case "three": 
      break; 
      default: 
      break; 
     } 
+2

あなたは(http://perldoc.perl.org/Switch.html#Allowing-fall-through)[フォールスルーを許可する]を意味するのですか? – Mike

+5

@Mike:Switch.pmは実験だったが、今はとても後悔している。 – ysth

答えて

14

Switch statements> = 5.10givenwhen構築物を使用して実装されています。これは、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で

+1

上付き文字をうまく使います。 :) –

4

、することができますハッシュでsubrefsとそれ偽:それは怪しげな機能だが、

my %switch = (
    foo => sub { do_something() }, 
    bar => sub { do_something_else() }, 
); 
exists $switch{$check_var} ? $switch{$check_var}->() : do_the_default_case(); 

それはあなたが落ちるスルー与えるものではありません(無ダフのデバイス)。 Perlで

+0

これは、デフォルトのオプションをサポートしているか、またはスイッチの値が一致していないかのように見えません(この例の 'baz'は問題を引き起こします)。それはできる最善のことがあります。 –

+3

@Jonathan Lefflerデフォルトのオプションは、 'if'ステートメントまたは条件演算子によって実現されます。ディスパッチテーブルを使用するときに存在チェックを追加することは、たとえすべてがエラーメッセージで「死んでいる」場合でも、常に良い考えです。 –

5

、それは次のようになります

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、今他の述語が適用されるものを探す」と思われるようです。

私は、これは「並べ替えの演算子」のように誤って見えますが、実際には「もう一度見える」演算子だからです。

1

あなたの場合フォールスルーする必要、あなたは(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から抜き取りました。

-1

次は私のために働いている:

use Switch;

+0

Switch.pmはおすすめしません。これはソースフィルタであり、厄介な微妙なバグにつながる可能性があります。 Perl 5.10で追加された/ when構文ははるかに安全です。 –

+1

多くの企業が5.10より下のバージョンを実行し、書き込まれているものが単純な雑用スクリプトであれば、Switch.pmは簡単なソリューションです。 –

+0

さて、これらの企業がある時点で、より最近のバージョンのPerlにアップグレードすることを願っています:-)しかし、とにかく、Switch.pmはソースフィルタです。つまり、純粋なプログラマが生産コード。 –