Recipe 15.11 Editing Input

15.11.1 Problem

You want a user to be able to edit a line before sending it to you for reading.

15.11.2 Solution

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;

$line = $term->readline($prompt);

print $OUT "Any program output\n";

15.11.3 Discussion

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;

If you want to seed the history with your own functions, use the addhistory method:


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, 1 the second, and so on up to the most recent history lines.


To get a list of history lines, use the GetHistory method, which returns a list of the lines:

@history = $term->GetHistory;

15.11.4 See Also

The documentation for the standard Term::ReadLine module and the Term::ReadLine::Gnu from CPAN