Perl 5でcaseまたはswitchステートメントを作成するための適切な方法はありますか?バージョン6にスイッチを含める必要があるように思われます。
スクリプトでこの制御構造が必要ですが、「スイッチモジュール」をインポートできると聞きました。しかし、依存関係を最小限に抑え、移植性を獲得するために、インポートなしでそれをどのように達成できますか?
Perl 5でcaseまたはswitchステートメントを作成するための適切な方法はありますか?バージョン6にスイッチを含める必要があるように思われます。
スクリプトでこの制御構造が必要ですが、「スイッチモジュール」をインポートできると聞きました。しかし、依存関係を最小限に抑え、移植性を獲得するために、インポートなしでそれをどのように達成できますか?
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
ます。elsif
else
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; }
}
プログラミングPerlの提案は次のとおりです。
for ($string) {
/abc/ and do {$abc = 1; last;};
/def/ and do {$def = 1; last;};
/xyz/ and do {$xyz = 1; last;};
$nothing = 1;
}
回答で数回言及されているコアSwitchモジュールについての短いコメントです。問題のモジュールは、ソース フィルターに依存しています。とりわけ、これにより、誤った行がエラーとして報告される可能性があります。そもそもなぜそれが perl コアに受け入れられたのかを、コア開発者の誰も本当に覚えていない、または覚えようとしないのは非常に残念です。
さらに、Switch.pm は、perl コアから削除される最初の Perl モジュールになります。perl の次のメジャー リリースである 5.12.0 には、非推奨の警告がありますが、まだあります。CPAN から Switch.pm を明示的にインストールすると、この非推奨の警告はなくなります。(あなたが求めるものを手に入れることができます。) 今後の次のリリースである 5.14 では、Switch.pm はコアから完全に削除されます。
私が気に入っている同等のソリューションは、ディスパッチテーブルです。
my $switch = {
'case1' => sub { print "case1"; },
'case2' => sub { print "case2"; },
'default' => sub { print "unrecognized"; }
};
$switch->{$case} ? $switch->{$case}->() : $switch->{'default'}->();