start page | rating of books | rating of authors | reviews | copyrights

Perl Cookbook

Perl CookbookSearch this book
Previous: 15.10. Reading Passwords Chapter 15
User Interfaces
Next: 15.12. Managing the Screen
 

15.11. Editing Input

Problem

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

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

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;











See Also

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


Previous: 15.10. Reading Passwords Perl Cookbook Next: 15.12. Managing the Screen
15.10. Reading Passwords Book Index 15.12. Managing the Screen

Library Navigation Links

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