Добрый день!Подскажите, как реализовать программу, которая бы не ожидая ввода в нужный момент знала о нажатии на клавиатуру.
Поясню. Вот, например:my $k;
while (1) {
$k=<STDIN>;
chomp($k);
if ($k eq "q") {exit};
# А тут нужно вставить код, который бы выполнялся постоянно, чтобы STDIN не задерживало цикл.
};В этом примере, когда дело дойдёт до STDIN произойдет ожидание ввода. И пока я не введу что-либо, да ещё и плюс ENTER - ничего дальше не сдвинется. А мне нужно, чтобы цикл вращался и не затыкался на STDIN, но когда будет нажата клавиша, чтобы я знал об этом.
Как это реализовать?Заранее благодарен,
Вячеслав
>Подскажите, как реализовать программу, которая бы не ожидая ввода в нужный момент
>знала о нажатии на клавиатуру.Смотреть в сторону Curses или IO::Tty
>>Подскажите, как реализовать программу, которая бы не ожидая ввода в нужный момент
>>знала о нажатии на клавиатуру.
>
>Смотреть в сторону Curses или IO::TtyВобщем после долгих ковыряний родил вот такую простую функцию, которая решает мою задачу.
sub getchar {
system "stty", "-icanon", "min", "0";
my $key = <STDIN>;
system "stty", "icanon", "eol", "^@"; # ASCII NUL
return ($key);
};Пользуйтесь на здоровье.
Всем спасибо!
>[оверквотинг удален]
>
>sub getchar {
>system "stty", "-icanon", "min", "0";
>my $key = <STDIN>;
>system "stty", "icanon", "eol", "^@"; # ASCII NUL
>return ($key);
>};
>
>Пользуйтесь на здоровье.
>Всем спасибо!Молодец. Можешь еще в сторону Term::ReadKey посмотреть.
>Молодец. Можешь еще в сторону Term::ReadKey посмотреть.Ну и конечно же обычный select() тоже поможет.
>Ну и конечно же обычный 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");
}
}