PERL: БИБЛИОТЕКА ПРОГРАММИСТА


           

Следующий модуль, 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;



@ISA = qw(Exporter),

@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) ) {


Содержание  Назад  Вперед