Aiden Bell의 힌트에 따라 Perl에서 Readline을 시도했습니다. 해결 방법 1 사용 기간 : 전체 (또한 CPAN에서 사용하는, 내가 생각하는) :
use Term::Complete;
my $F;
open($F,"<","bin/phonebook.csv");
my @terms = <$F>; chomp(@terms);
close($F);
my $input;
while (!defined $input) {
$input = Complete("Enter a name or number: ",@terms);
my ($name,$number) = split(/\t/,$input);
print("Sending SMS to $name ($number).\n");
system("sudo gammu --sendsms TEXT $number");
}
을 눌러 \ 모든 가능성을 참조하려면 Ctrl-D를 완료합니다.
해결 방법 2 : Ctrl-D는 하나의 키 스트로크이기 때문에 표준 Term :: Readline을 사용하면 완료가 가능하고 \ 만 사용하여 가능한 완성을 표시 할 수 있습니다.
use Term::ReadLine;
my $F;
open($F,"<","bin/phonebook.csv");
my @terms = <$F>; chomp(@terms);
close($F);
my $term = new Term::ReadLine;
$term->Attribs->{completion_function} = sub { return @terms; };
my $prompt = "Enter name or number >> ";
my $OUT = $term->OUT || \*STDOUT;
while (defined (my $input = $term->readline($prompt))) {
my ($name,$number) = split(/\t/,$input);
print("Sending SMS to $name ($number).\n");
system("sudo gammu --sendsms TEXT $number");
}
이 솔루션은 여전히 완료해야합니다.
편집 : 최종 솔루션 수정 기간 : 전체 (http://search.cpan.org/~jesse/perl-5.12.0/lib/Term/Complete.pm)는 즉시 완료 나를 준다.
소스 코드 : http://search.cpan.org/CPAN/authors/id/J/JE/JESSE/perl-5.12.0.tar.gz 솔루션 번호 1이 수정되었습니다. 이것은 누군가에 의해 사용될 수 있다면 다른 곳에서 온라인으로 전체 샘플을 넣어 것입니다
Completion.pm (그냥 각 문자에 대한 제어-D와 \에 대한 코드의 재사용)의 수정 :
170c172,189
my $redo=0;
@match = grep(/^\Q$return/, @cmp_lst);
unless ($#match < 0) {
$l = length($test = shift(@match));
foreach $cmp (@match) {
until (substr($cmp, 0, $l) eq substr($test, 0, $l)) {
$l--;
}
}
print("\a");
print($test = substr($test, $r, $l - $r));
$redo = $l - $r == 0;
if ($redo) { print(join("\r\n", '', grep(/^\Q$return/, @cmp_lst)), "\r\n"); }
$r = length($return .= $test);
}
if ($redo) { redo LOOP; } else { last CASE; }
나는 모든 키 입력을 할 수 없다면 어렵게 눌렀을 것이라고 생각합니다. 이러한 것들은 완전한 절차를 호출하기위한 방아쇠가 필요합니다. –
+1 멋진 작은 해킹. –