August 1998
Intermediate to advanced
800 pages
39h 20m
English
You want a user to be able to edit a line before sending it to you for reading.
Use the standard Term::ReadLine library along with the Term::ReadLine::Gnu module from CPAN:
use Term::ReadLine;
$term = Term::ReadLine->new("APP DESCRIPTION");
$OUT = $term->OUT || *STDOUT;
$term->addhistory($fake_line);
$line = $term->readline(PROMPT);
print $OUT "Any program output\n";The program in Example 15.4 acts as a crude shell. It
reads a line and passes it to the shell to execute. The
readline method reads a line from the terminal,
with editing and history recall. It automatically adds the
user’s line to the history.
Example 15-4. vbsh
#!/usr/bin/perl -w
# vbsh - very bad shell
use strict;
use Term::ReadLine;
use POSIX qw(:sys_wait_h);
my $term = Term::ReadLine->new("Simple Shell");
my $OUT = $term->OUT() || *STDOUT;
my $cmd;
while (defined ($cmd = $term->readline('$ ') )) {
my @output = `$cmd`;
my $exit_value = $? >> 8;
my $signal_num = $? & 127;
my $dumped_core = $? & 128;
printf $OUT "Program terminated with status %d from signal %d%s\n",
$exit_value, $signal_num,
$dumped_core ? " (core dumped)" : "";
print @output;
$term->addhistory($cmd);
}If you want to seed the history with your own functions, use the
addhistory method:
$term->addhistory($seed_line);
You can’t seed with more than one line at a time. To remove a
line from the history, use the remove_history
method, which takes an index into the history list.
0 is the first (least recent) entry, ...