ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП |
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы. |
15.11. Editing InputProblemYou want a user to be able to edit a line before sending it to you for reading. SolutionUse 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"; DiscussionThe program in Example 15.4 acts as a crude shell. It reads a line and passes it to the shell to execute. The 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 $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 $term->remove_history($line_number); To get a list of history lines, use the @history = $term->GetHistory; See AlsoThe documentation for the standard Term::ReadLine module and the Term::ReadLine::Gnu from CPAN |