パターンにマッチする回数を数える

back
パターンマッチでは、スカラーコンテキストではマッチした回数に関係なく
マッチするしないで真(1)か偽("")しか返さない。

$return = ($string =~ /PATTERN/g);

が、リストコンテキストでは、パターンにマッチした文字列を全て返すので、それを数えれば良い。

@tmp = ($string =~ /PATTERN/g);
$count = scalar @tmp;

1 liner
$count = () = ($string =~ /PATTERN/g);
パターン置換演算子を空のリストで受けることでリストコンテキストで呼び出し、
その結果をスカラーで受ける。


対して、パターン置換では、置換に成功した回数を返す
そこで、メモリ変数をつかって、元の文字列に置換すれば、パターンにマッチした回数が得られる。

$return = ($string =~ s/(PATTERN)/$1/g;

または、対象パターン以外で split し、無名配列のリファレンスを
スカラーコンテキストで評価すれば、同じ値を得られる

$return = scalar @{[split(/[^(?:PATTERN)]/, $string)]};

同様にパターンマッチの無名配列のリファレンスをスカラーコンテキストで評価してもよい
$return = scalar @{[$string =~ /PATTERN/g]};


他にもあるかも

back