Perl の標準モジュール Search::Dict は、ソート済みのテキストファイルを対象に、二分探索でキーワードと各行の前方一致を調べ、マッチした行を取り出すという、高速検索モジュールです。インデックスの作成は不要。詳しくは、 perldoc Search::Dict で! ソースを見比べてはないけど仕組みはUNIX系コマンドの look と同じかと。
で、さっそくサンプルプログラム。
searchdict.pl
検索対象テキストファイルのサンプル(sample.txt):
実行例:
参考までに look コマンドでの実行例:
- lookコマンドによる二分探索が速すぎて見えない - Yuta.Kikuchiの日記
http://d.hatena.ne.jp/yutakikuchi/20121029/1351467398
で、さっそくサンプルプログラム。
searchdict.pl
#!/usr/bin/perl
use strict;
use warnings;
use Search::Dict;
my ($key, $fn) = @ARGV;
open(my $fh, "<", $fn) or die;
look $fh, $key;
my $line = readline($fh);
while ($line =~ /^\Q$key\E/) {
print $line;
$line = readline($fh);
}
close($fh);
(Search/Dict.pm のコードによれば、複数マッチの場合、辞書順的に先頭のものが返される仕様なので、複数結果のときの取り出し方はこれで良いはず。)検索対象テキストファイルのサンプル(sample.txt):
12345 456789 abc abx abyz あい あいあい あいたた わお わおん
実行例:
% ./searchdict.pl 'ab' sample.txt abc abx abyz % ./searchdict.pl 'あい' sample.txt あい あいあい あいたた
参考までに look コマンドでの実行例:
% look 'ab' sample.txt abc abx abyz % look 'あい' sample.txt あい あいあい あいたた
参考記事
- lookコマンドによる二分探索が速すぎて見えない - Yuta.Kikuchiの日記
http://d.hatena.ne.jp/yutakikuchi/20121029/1351467398
