Term::ReadLine
Jiri Polcar
polcar na monoceros.physics.muni.cz
Neděle Březen 24 12:06:26 MET 2002
Zdravim,
pokusim se popsat muj problem s Term::ReadLine:
uzivatelske rozhrani, ktere programuju, pouziva k prijimani prikazu od
uzivatele modul Term::ReadLine. Tvori ho `while' cyklus, ve kterem se vola fce
`readline', a ve kterem se provadeji prikazy. Jeden z prikazu prepne uzivatele
do "jineho" rezimu, ve kterem se pousti dalsi (obdobny) cyklus pro nacitani
prikazu. Vse znovu nainicializuji, ale presto se zahadnym zpusobem
sdili historie obou Term::ReadLine promennych.
Nejhorsi je, ze v mem pripade (narozdil od toho kodu, co uvadim jako soucast
dotazu) dojde po ukonceni "vnejsiho" `while' cylku k
Segmentation fault
Bohuzel, koflikt se me nepodaril izolovat v prikladu.
Zajimalo by me, jak z toho ven? Neni mozne, ze je problem ve sdileni STDIN
obou instanci? Jaky vyznam ma 'name' v
$term = new Term::ReadLine 'name';
Priklad, ktery uvadim, nacita radky od uzivatele, a kdyz uzivatel zada "t2",
inicializuje se dalsi instance Term::ReadLine.
__END__
#!/usr/bin/perl -w
use strict;
use Term::ReadLine;
my $OUT;
my $attribs;
my $cl;
my $ci;
my $term;
$term = new Term::ReadLine 't1';
$attribs = $term->Attribs;
$attribs->{attempted_completion_function} = \&sample_completion;
$attribs->{'completion_word'} = [ 't2' ];
$OUT = $term->OUT || 'STDOUT';
$term->ReadHistory('history_1');
$ci = "001";
while ( defined ( $cl = $term->readline( "t1 ".$ci++.">" ) ) ) {
$term->AddHistory( $cl );
if ( $cl eq 't2' ) { term2(); }
}
$term->WriteHistory('history_1');
sub sample_completion {
my ($text, $line, $start, $end) = @_;
if (substr($line, 0, $start) =~ /^\s*$/) {
return $term->completion_matches($text,
$term->Attribs->{'list_completion_function'});
} else { return (); }
}
sub term2 {
my $__term = new Term::ReadLine 't2';
my $__ci;
my $__cl;
$__ci = "001";
$__term->ReadHistory('history_2');
while (defined ($__cl = $__term->readline("t2 ".$__ci++.">" ))) {
next unless ( $__cl =~ /\S/ );
last if ($__cl eq 'quit');
$__term->AddHistory( $__cl );
}
$__term->WriteHistory('history_2');
}
Další informace o konferenci Perl