# Perl で文字列の出現数を取得するモジュール書いた たぶん再開発かもですが、一発関数が欲しかった。 ## Text::CountString {{cpan: 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。いまのところ都度切り替えるような風にはしてない。 おすおす。