Editing Input (Perl Cookbook, 2nd Edition)

## 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;

>     $term->addhistory($fake_line);
>     $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;
>           $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, `1` the second, and so on up to the most recent history lines.

>     $term->remove_history($line_number);

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

Copyright © 2003 O'Reilly & Associates. All rights reserved.