プログラム

#!/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;
	}
}