プログラム

#!/usr/local/bin/perl
#
#	文字ターミナル(vt100)を使うもの。リターンを押すと検索を実行
#
require 'vt100.pl';
require 'tty.pl';

&dicread;
&clear;
&cbreak;
$| = 1;
$pat = '';
$patcol = $patrow = 0;

while($c = ord($s = getc)){
	$len = length($pat);
	if($c == &ctrl('J')){ # リターンキー
		last if $pat =~ /^\s*exit\s*$/; # 'exit'とタイプすると終了
		&lookup($pat);
	}
	elsif($c == &ctrl('B')){ # カーソル左移動
		$patcol-- if $patcol > 0;
	}
	elsif($c == &ctrl('F')){ # カーソル右移動
		$patcol++ if $patcol < $len;
	}
	elsif($c == &ctrl('A')){ # カーソル左端移動
		$patcol = 0;
	}
	elsif($c == &ctrl('E')){ # カーソル右端移動
		$patcol = $len;
	}
	elsif($c == &ctrl('K')){ # カーソルより右の文字消去
		$pat = substr($pat,0,$patcol);
	}
	elsif($c == 0x7f){ # 後退
		$patcol-- if $patcol > 0;
		$pat = substr($pat,0,$patcol) . substr($pat,$patcol+1);
	}
	elsif($c == &ctrl('D')){ # カーソル位置の文字消去
		$pat = substr($pat,0,$patcol) . substr($pat,$patcol+1);
	}
	else {
		$pat = substr($pat,0,$patcol) . $s . substr($pat,$patcol);
		$patcol++;
	}
	&clear;
	&display;
	&move(0,0);
	print $pat;
	&move($patcol,$patrow);
}

sub display {
	for $i (0..$#match){
		&move(0,$i+2);
		$m = $match[$i];
		print "$e[$m] $j[$m])";
	}
}

sub ctrl {
	ord($_[0]) - ord('@');
}
sub dicread { # #1と同じ ...
sub lookup { # #1と同じ ...