Perl Perl_4
Perl スマートで実験的な条件分岐 given, when, continue, dfauelt (0x251)

目次 - Perl Index
Theme
Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0x251 回。
Perl で、スマートかつ実験的な条件分岐を行う制御構造「 given/when 」を確認する。
NOTE: ただし、「 スマートマッチングの仲間の機能は実験的なものになりました 」。
Perl 的な switch 文「 given/when 」
Perl には、バージョン「 5.10.0 」で追加された条件分岐の制御構造「 given/when 」があります。
これは、C 言語の「 switch 」文のような条件分岐が可能な制御構造ですが、スマートマッチング演算子「 ~~ 」と同じく、Perl のバージョン「 5.10.1 」で少しまともになり、バージョン「 5.18.0 」で実験的な機能に格下げ ( ? ) されました。
ここでは、そんな実験的な制御構造「 given/when 」の動作概要を確認してみます。
また、スマートマッチング演算子と同じく、Perl バージョン「 5.10.1 」以上の利用を明示するために次のプラグマを指定します。
use 5.010001;
制御構造「 given/when 」
制御構造「 given/when 」は、例えば次のように利用します。
use 5.010001;
# given に与える値をセット
my $greeting = 'Good morning.';
given ($greeting) {
# given にセットされた値と when でスマートマッチング
when ( /morning/ ) { say 'morning' }
when ( /afternoon/ ) { say 'afternoon' }
when ( /evening/ ) { say 'evening' }
}
「 given 」の中に記述した 3 つ「 when 」では、それぞれマッチ演算子「 // 」を使ったパターンマッチングを行っています。
ここでは、given の値「 $greeting 」に「 Good morting 」を指定しているので、プログラムを実行すると「 morning 」が出力されます。
部分一致と全体一致
マッチ演算子「 // 」ではなく、クォーティングした文字列をそのまま指定してマッチングすることも出来ます。
ただし、その場合は値の全体がマッチしなければいけません。
use 5.010001;
my $greeting = 'Good morning.';
given ($greeting) {
# 全体一致で実行
when ( 'morning' ) { say 'Full match' }
# 部分一致で実行
when ( /morning/ ) { say 'Partial match' }
}
ですから、この場合は「 Partial match 」が出力されます。
暗黙の「 break 」
次のプログラムの 2 つの「 when 」では、いずれも「 $greeting 」の値とマッチングするはずです。
use 5.010001;
my $greeting = 'Good morning.';
given ($greeting) {
when ( 'Good morning.' ) { say 'Full match' }
when ( /morning/ ) { say 'Partial match' }
}
しかしながら、プログラムを実行して出力されるのは「 Full match 」のみだけです。
なぜなら、「 when 」のブロック「 { } 」の末尾には、暗黙的に「 break 」があるからです。「 break 」は given ブロックから抜けることが出来る演算子で、ループを抜ける「 last 」(0x10) と似た機能をもっています。
「 continue 」を指定する
暗黙の「 break 」の代わりに、「 continue 」(0x12) を明示的に記述すると、すべての when を機能させることが出来ます。
use 5.010001;
my $greeting = 'Good morning.';
given ($greeting) {
when ( 'Good morning.' ) { say 'Full match'; continue }
when ( /morning/ ) { say 'Partial match: morning'; continue }
when ( /good/i ) { say 'Partial match: good'; continue }
when ( /G*m*ing./ ) { say 'Partial match: G*m*ing.' }
}
このプログラムではすべての when の条件がマッチするので、次の出力が得られます。
Full match
Partial match: morning
Partial match: good
Partial match: G*m*ing.
「 dafault 」でデフォルトの値をセットする
すべての「 when 」の条件がマッチングしない場合のために、「 default 」のブロックが利用出来ます。
例えばコードでは、given の値がいずれの when にもマッチングしないので、出力結果は「 default 」になります。
use 5.010001;
my $greeting = 'How was your today?';
given ($greeting) {
when ( 'Good morning.' ) { say 'Full match'; continue }
when ( /morning/ ) { say 'Partial match: morning' }
# デフォルトの値
default { say 'default' }
}
0x251 -> 0x252 へ
制御構造「 given/when 」は、C 言語の「 switch 」的な条件分岐が可能ですが、これは、「 if/else 」文でも記述可能で、単純に処理速度を求めるなら「 if/else 」が優位とのことです。
Perlのswitch文とif/else文のベンチマークを取ってみた - $web->{note};
次回は、「 default 」と「 continue 」の扱いで少し混乱した話を確認します。
参考情報は書籍「 初めての Perl 第 6 版 」を中心に perldoc, Wikipedia および各 Web サイト。それと詳しい先輩。
目次 - Perl Index
Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)
Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227)
Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226)
Perl mp2 翻訳 テンプレートシステムの選択 (d225)
Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224)
Perl mp2 翻訳 チュートリアル (d223)