理系学生日記

おまえはいつまで学生気分なのか

正規表現にマッチした個数

毎日毎日正規表現にマッチした個数は何個かなってことを考えているぼくです.
例えば "This is a pen" っていう文字列の中に 'i' がいくつ入ってるかなってとき,使われるのに tr とかがある.

my $a = 'This is a pen.';
print "(using tr): Number of 'i' is ", $a =~ tr/i/i/, "\n";
# prints "(using tr): Number of 'i' is 2"

これで 'i' の数が数えられるんですけど,tr が引数にとるのは別に正規表現てわけじゃないですね.tr にできるのはせいぜい文字レベルのマッチングだ!

リストコンテキストで使われる match operator を 'g' で修飾してやると,正規表現にマッチする配列を返してくれる.だからマッチした個数を返してやるにはこんな感じでいちおうできる.

my @result = $a =~ /i/g;
print scalar( @result );

ただ,リストコンテキストの代入演算子は右辺のリストの要素数とかを返してくれるんで,変数を導入しなくても良いです.

print "(using re): Number of 'i' is ", scalar( () = $a =~ /i/g ), "\n";
# prints "(using re): Number of 'i' is 2"

空リストに代入することで要素は捨てるけども,リスト代入の戻り値のみ使う.読みやすいかどうかは分かんないですけども.