2016-08-09 3 views
3

私が書いた最後のスクリプトの1つでは、switch文の振る舞いに似た振る舞いが必要でした。 Perlで同等のものを簡単に検索すると、use Switchになりました。最初はすべてがうまく機能していて、すべてが説明的ではないエラーでクラッシュした(これは正規表現の場合に起こったswitch文で起こりましたが、奇妙なことに他のswitch文では起こりませんでした)。スイッチ対与えられた対対Perlのif-elsif-else対

EDIT:墜落したコードはこの1つのように見ていた:Switch.pmの使用を断念し、代わりを検索するために私を導い

switch ($var) { 
    case /pattern1/ {...} 
    case /pattern2/ {...} 
    ... 
    else {...} 
} 

私はgivenfor-whenを見つけました。もちろん、直接的でやや素朴なものがあります。if-elsif-elseです。

  1. なぜSwitch.pmが不安定なのですか?
  2. givenfor-whenの構造は類似していますが、違いがあると思います(両方存在するため)。それは何ですか?
  3. if-elsif-elseは他のオプションよりも大幅に遅いですか?
+2

関連:http://stackoverflow.com/q/2630547/5830574 – PerlDuck

+0

これは私の最初の質問に感謝します! '与えられた'にはより多くの能力があることを知っていることもうれしいです。 – yonyon100

+0

'given'がレキシカル' $ _'を設定するのに使われましたが、それはもう存在しません。 /// 'given'の式はスカラーコンテキストで評価され、' for'は返されたスカラーに対してループします。 ///何かは、 'given'と' for'で許されるフロー制御キーワードに違いがあることを示しています。 – ikegami

答えて

7

Perlのwhenとスマートマッチングが実験的であり、won'tが後方互換性のない変更となる機能になります。これらは使用しないでください。

Switch.pmはソースフィルタであるため、何か問題があった場合に間違ったエラーメッセージが表示される可能性があります。また、スマートマッチングと同じ問題があります。これは使用しないでください。

リストにあるオプションのうち、実行可能なものは1つだけですが、それはまったく遅くはありません。

+0

偉大な答え。 Instinctは 'if-elsif-else'はケース処理のための専用のステートメントやモジュールよりも遅いと言いました。なぜなら、それが全く遅くないのであれば、最初にこれらのモジュールを作成するのはなぜですか? – yonyon100

+1

これは単なる構文です。例えば、 '(qw(def))){...} ...}' 'vs' if([qw(abc)])次のように定義されます。x eq $ _} qw(abc)){...} elsif(grep {$ x eq $ _} qw(def)){...} ... ' – ikegami

関連する問題