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 村山 俊之

タグ: ,

コメントをどうぞ