2014/04/28

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。いまのところ都度切り替えるような風にはしてない。

おすおす。

サイト内検索