Следующий модуль, HotKey, реализует функцию
pnntf Kill is character %d, %s\n , $кдП, uncontrol(chr($kill)),
$term->setcc(VERASE, ord(¦#')); $tern->setcc(VKILL, ord('@>')); $term->setattr(1, TCSANOW);
print('erase is #, kill is @, type something: ' ),
$line = <STDIN>;
print "You typed: $line";
$term->setcc(VERASE, $erase); $term->setcc(VKILL, Skill); $terrn->setattr(1, TCSANOW);
sub uncontrol {
local $_ = shift,
s/([\200-\377])/spnntf( M-%c",ord($1) & 0177)/eg;
s/([\0-\37\177])/sprintf('"%c",ord($1) " O100)/eg;
return $_; }
Следующий модуль, HotKey, реализует функцию read key на Perl. Он не обладает никакими преимуществами по сравнению с Term::ReadKey, а всего лишь показывает интерфейс termios в действии:
# HotKey pm
package HotKey;
@EXP0RT = qw(cbreak cooked readkey);
use strict;
use POSIX qw(:termios_h);
my ($term, $oterm, $echo, $noecho, $fd_stdin);
$fd_stdin = fileno(STDIN); $term = POSIX:.Termios->new(), $term->getattr($fd_stdin); Soterrn = $term->getlflag(),
$echo = ECHO | ECHOK | ICANON, $noecho = $oterm & ~$echo;
sub cbreak {
$term->setlflag($noecho); # Эхо-вывод не нужен $term->setcc(VTIME, 1), $term->setattr($fd_stdin, TCSANOW);
sub cooked {
$term->setlflag($oterm); $term->setcc(VTIME, 0), $term->setattr($fd_stdin, TCSANOW);
sub readkey { my $key = ''; cbreak(),
sysread(STDIN, $key, 1); cooked(); return $key;
END < cookedO }
> Смотри также
Документация по стандартному модулю POSIX; рецепты 15.6; 15.9.
15.9. Проверка наличия входных данных
Проблема
Требуется узнать, имеются ли необработанные входные данные, не выполняя их фактического чтения.
Решение
Воспользуйтесь модулем Term::ReadKey от CPAN и попытайтесь прочитать символ в неблокирующем режиме, для этого используется аргумент -1:
use Term':ReadKey, ReadMode ('cbreak');
if (defined ($char = ReadKey(-D) ) {
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий