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