#!/usr/local/bin/perl
#
# Perlによる辞書引きプログラム。grepとほとんど同じ。
#
require "getopts.pl";
&Getopts('p');
$repeat = $opt_p;
$pat = shift;
exit if !$opt_p && !$pat;
% &dicread;
if($repeat){
$| = 1; # stdoutヘのバッファリングオフ
open(tty,"/dev/tty"); # 入力tty
while(1){
print "英和> "; # プロンプト表示
$pat = <tty>; # ユーザ入力取得
last if $pat eq '';
chop($pat);
&lookup($pat); # 検索実行
}
print "\n";
}
else {
&lookup($pat);
}
sub dicread { # 辞書全体を配列$e[]に読み込む
open(dic,'ejdic') || die "Can't open ejdic";
while(<dic>){
chop; # 行末の'\n'を除去
($e[$i], $j[$i]) = split; # 文字列を空白で分割
$i++;
}
close(dic);
}
% sub lookup { # 辞書引き関数定義
local($pat) = @_;
local($p1,$p2,$max,$min,$mid); # ローカル変数
$min = 0,
$max = $#e; # 配列 $e[]の要素数
$p1 = "\L$pat";
while ($max - $min > 1) { # 単語の二分検索
$mid = int(($max + $min) / 2);
$_ = "\L$e[$mid]";
if ($_ lt $p1) {
$min = $mid;
}
else {
$max = $mid;
}
}
$n = 0;
for($i=$max;$i<=$#e;$i++){
last if $e[$i] !~ /,?^$pat/i; # パタンにマッチするエントリを表示
print "$e[$i]\t$j[$i]\n"; # 英単語/日本語訳ペア表示
last if $n++ > 20;
}
}