Perl の正規表現はリストコンテキストでキャプチャがないと (1) を返す
Perl で、
my @cap = $uri{$mkey} =~ /$ex_item->{match}{$mkey}{pattern}/ or next EX_MATCH_LOOP; @vars{@{$ex_item->{match}{$mkey}{vars}}} = @cap if exists $ex_item->{match}{$mkey}{vars} && ref $ex_item->{match}{$mkey}{vars} eq 'ARRAY';
なんてコードを書いていて (何をやろうとしているのかは想像にお任せします… 別にプロプライエタリなコードじゃないし、いちいち擬似コード的に書き直すのも面倒なのでそのまま持って来ちゃいましたw)、ふと、ここでやっている正規表現のパターンにキャプチャが含まれていなかった場合、マッチするのに or
の後に処理が流れてしまうことはないのかと疑問に思いました。
結論としては、上記のコードに問題はないようです (まだテストしてないけど)。以下のように、スモールケースで試してみると、リストコンテキストではパターンにキャプチャがない場合でも空リストを返すのではなく、 (1)
、すなわち値 1
のみを持つリストを返してくれることが分かります。
$ perl -e '$x = "foo bar baz"; @s = $x =~ /bar/ or print "no match?\n"; print join(", ", @s), "\n"' 1 $
もちろん、キャプチャがある場合には、キャプチャリングされた値がリストとして返されます。
$ perl -e '$x = "foo bar baz"; @s = $x =~ /(b)(ar)/ or print "no match?\n"; print join(", ", @s), "\n"' b, ar $
2011 年 9 月 1 日 by 村山 俊之