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, 20:01 , 12-Фев-08 (1)
>Подскажите, как реализовать программу, которая бы не ожидая ввода в нужный момент >знала о нажатии на клавиатуру. Смотреть в сторону Curses или IO::Tty
- PERL: Как контролировать нажатие без ожидания ввода?, slw, 23:36 , 12-Фев-08 (2)
>>Подскажите, как реализовать программу, которая бы не ожидая ввода в нужный момент >>знала о нажатии на клавиатуру. > >Смотреть в сторону Curses или IO::Tty Вобщем после долгих ковыряний родил вот такую простую функцию, которая решает мою задачу. sub getchar { system "stty", "-icanon", "min", "0"; my $key = <STDIN>; system "stty", "icanon", "eol", "^@"; # ASCII NUL return ($key); }; Пользуйтесь на здоровье. Всем спасибо!
- PERL: Как контролировать нажатие без ожидания ввода?, sn, 09:17 , 13-Фев-08 (3)
>[оверквотинг удален] > >sub getchar { >system "stty", "-icanon", "min", "0"; >my $key = <STDIN>; >system "stty", "icanon", "eol", "^@"; # ASCII NUL >return ($key); >}; > >Пользуйтесь на здоровье. >Всем спасибо! Молодец. Можешь еще в сторону Term::ReadKey посмотреть.
- PERL: Как контролировать нажатие без ожидания ввода?, anonymous, 23:07 , 13-Фев-08 (4)
>Молодец. Можешь еще в сторону Term::ReadKey посмотреть. Ну и конечно же обычный select() тоже поможет.
- PERL: Как контролировать нажатие без ожидания ввода?, from_mars, 03:33 , 14-Фев-08 (5)
>Ну и конечно же обычный 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"); } }
|