URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7176
[ Назад ]

Исходное сообщение
"PERL: Как контролировать нажатие без ожидания ввода?"

Отправлено slw , 12-Фев-08 18:11 
Добрый день!

Подскажите, как реализовать программу, которая бы не ожидая ввода в нужный момент знала о нажатии на клавиатуру.
Поясню. Вот, например:

my $k;
while (1) {
$k=<STDIN>;
chomp($k);
if ($k eq "q") {exit};
# А тут нужно вставить код, который бы выполнялся постоянно, чтобы STDIN не задерживало цикл.
};

В этом примере, когда дело дойдёт до STDIN произойдет ожидание ввода. И пока я не введу что-либо, да ещё и плюс ENTER - ничего дальше не сдвинется. А мне нужно, чтобы цикл вращался и не затыкался на STDIN, но когда будет нажата клавиша, чтобы я знал об этом.
Как это реализовать?

Заранее благодарен,
Вячеслав


Содержание

Сообщения в этом обсуждении
"PERL: Как контролировать нажатие без ожидания ввода?"
Отправлено AMDmi3 , 12-Фев-08 20:01 
>Подскажите, как реализовать программу, которая бы не ожидая ввода в нужный момент
>знала о нажатии на клавиатуру.

Смотреть в сторону Curses или IO::Tty


"PERL: Как контролировать нажатие без ожидания ввода?"
Отправлено slw , 12-Фев-08 23:36 
>>Подскажите, как реализовать программу, которая бы не ожидая ввода в нужный момент
>>знала о нажатии на клавиатуру.
>
>Смотреть в сторону Curses или IO::Tty

Вобщем после долгих ковыряний родил вот такую простую функцию, которая решает мою задачу.

sub getchar {
system "stty", "-icanon", "min", "0";
my $key = <STDIN>;
system "stty", "icanon", "eol", "^@"; # ASCII NUL
return ($key);
};

Пользуйтесь на здоровье.
Всем спасибо!


"PERL: Как контролировать нажатие без ожидания ввода?"
Отправлено sn , 13-Фев-08 09:17 
>[оверквотинг удален]
>
>sub getchar {
>system "stty", "-icanon", "min", "0";
>my $key = <STDIN>;
>system "stty", "icanon", "eol", "^@"; # ASCII NUL
>return ($key);
>};
>
>Пользуйтесь на здоровье.
>Всем спасибо!

Молодец. Можешь еще в сторону Term::ReadKey посмотреть.


"PERL: Как контролировать нажатие без ожидания ввода?"
Отправлено anonymous , 13-Фев-08 23:07 
>Молодец. Можешь еще в сторону Term::ReadKey посмотреть.

Ну и конечно же обычный select() тоже поможет.


"PERL: Как контролировать нажатие без ожидания ввода?"
Отправлено from_mars , 14-Фев-08 03:33 
>Ну и конечно же обычный select() тоже поможет.

да, точно, тоже хотел посоветовать
я так делал в одном простеньком клиенте

vec($rb, fileno(STDIN), 1) = 1;
vec($rb, fileno(CD), 1) = 1; # сокет
if (select($rb, undef, undef, 1) > 0)
{
    if (vec($rb, fileno(STDIN), 1))
    {
        $data = <STDIN>;
        warn("client: sending data to server\n");
        send(CD, $data, 0) or warn("client: sending data fucked up\n");
    }
    if (vec($rb, fileno(CD), 1))
    {
        $data = <CD>;
        warn("recivied:\n$data");
    }
}