Perl で文字列の出現数を取得するモジュール書いた
たぶん再開発かもですが、一発関数が欲しかった。
Text::CountString
Text::CountString を use すると、count_string
関数がエクスポートされるので、対象となる文字列と、カウントする文字列を渡して使います。
use Text::CountString;
warn count_string("There is more than one way to do it", "re"); # 2
内部的には、正規表現でマッチする数を数えている。
my $count = () = ($target_text =~ /\Q$string\E/g);
なんだこの呪文のような文は、というのが今回モジュールにしてみた動機。そらで書けない。
さて、だいたいこの実装で良いのだけど、対象文字列のなかに多くの文字列が含まれる場合は、マッチする数を数えるより、split
実装の方が速いようす。
my $count = scalar(split /\Q$string\E/, $target_string, -1) - 1;
手元の環境だと、かなり多く含まれる場合でないと、正規表現で数えるので十分だが、それなりの場合は split
の方が速かった。
なので、Text::CountString
においては、以下のように実装を切り替えられるようにした。
use Text::CountString qw/split/;
use
する時以外は気にしないで OK。いまのところ都度切り替えるような風にはしてない。
おすおす。