28

Perl 5でcaseまたはswitchステートメントを作成するための適切な方法はありますか?バージョン6にスイッチを含める必要があるように思われます。

スクリプトでこの制御構造が必要ですが、「スイッチモジュール」をインポートできると聞きました。しかし、依存関係を最小限に抑え、移植性を獲得するために、インポートなしでそれをどのように達成できますか?

4

5 に答える 5

58

Perl 5.10を使用している場合は、switchステートメントであるgiven/whenがあります(正規表現と比較する以上のことができることに注意してください。リンクされたドキュメントを読んで、その可能性を最大限に確認してください)。

#or any of the dozen other ways to tell 5.10 to use its new features
use feature qw/switch/; 

given($string) {
    when (/^abc/) { $abc     = 1; }
    when (/^def/) { $def     = 1; }
    when (/^xyz/) { $xyz     = 1; }
    default       { $nothing = 1; }
}

Perl 5.8以前を使用している場合は、//ステートメントを使用する必要がありifます。elsifelse

if    ($string =~ /^abc/) { $abc     = 1; }
elsif ($string =~ /^def/) { $def     = 1; }
elsif ($string =~ /^zyz/) { $xyz     = 1; }
else                      { $nothing = 1; }

またはネストされた条件演算子(?:

$string =~ /^abc/ ? $abc     = 1  :
$string =~ /^def/ ? $def     = 1  :
$string =~ /^xyz/ ? $xyz     = 1  :
                    $nothing = 1;

Core Perl(Switch )には、ソースフィルターを介して偽のswitchステートメントを提供するモジュールがありますが、それは壊れやすいと私は理解しています。

use Switch;

switch ($string) {
    case /^abc/ {
    case /^abc/ { $abc     = 1 }
    case /^def/ { $def     = 1 }
    case /^xyz/ { $xyz     = 1 } 
    else        { $nothing = 1 }
}

または代替構文

use Switch 'Perl6';

given ($string) {  
    when /^abc/ { $abc     = 1; }
    when /^def/ { $def     = 1; }
    when /^xyz/ { $xyz     = 1; }
    default     { $nothing = 1; }
}
于 2009-05-10T03:37:02.623 に答える
20

プログラミングPerlの提案は次のとおりです。


for ($string) {
    /abc/ and do {$abc    = 1; last;};
    /def/ and do {$def    = 1; last;};
    /xyz/ and do {$xyz    = 1; last;};
    $nothing = 1;
}
于 2009-05-10T03:59:09.217 に答える
10

回答で数回言及されているコアSwitchモジュールについての短いコメントです。問題のモジュールは、ソース フィルターに依存しています。とりわけ、これにより、誤った行がエラーとして報告される可能性があります。そもそもなぜそれが perl コアに受け入れられたのかを、コア開発者の誰も本当に覚えていない、または覚えようとしないのは非常に残念です。

さらに、Switch.pm は、perl コアから削除される最初の Perl モジュールになります。perl の次のメジャー リリースである 5.12.0 には、非推奨の警告がありますが、まだあります。CPAN から Switch.pm を明示的にインストールすると、この非推奨の警告はなくなります。(あなたが求めるものを手に入れることができます。) 今後の次のリリースである 5.14 では、Switch.pm はコアから完全に削除されます。

于 2009-05-12T07:23:41.943 に答える
9

私が気に入っている同等のソリューションは、ディスパッチテーブルです。

my $switch = {
  'case1' => sub { print "case1"; },
  'case2' => sub { print "case2"; },
  'default' => sub { print "unrecognized"; }
};
$switch->{$case} ? $switch->{$case}->() : $switch->{'default'}->();
于 2009-05-11T15:36:47.153 に答える