Как заставить Perl использовать разные дескрипторы для ввода по каналу и ввода с клавиатуры? - PullRequest
6 голосов
/ 31 января 2011

У меня есть сценарий Perl, обрабатывающий канал. В какой-то момент я бы хотел, чтобы скрипт приостановил работу и запросил ввод с клавиатуры пользователя. my $input = <STDIN>; не работает. Он просто читает следующую строку из трубы. Как я могу заставить Perl использовать разные дескрипторы для ввода по каналу и ввода с клавиатуры?

1 Ответ

13 голосов
/ 31 января 2011

Если вы работаете на платформе Unix, вы можете открыть дескриптор файла для /dev/tty (или использовать IO::Pty).
Хороший пример работы с tty приведен в примере «Проверка работоспособности программы»: http://pleac.sourceforge.net/pleac_perl/userinterfaces.html

Вам также следует рассмотреть возможность ввода пароля через Term::ReadKey (описано в perlfaq8 ) - я думаю, что он может быть привязан к TTY вместо STDIO, но я не уверен. Если это не так, используйте решение TTY + Term :: ReadKey, указанное в конце этого SO ответа Брайана Д Фоя .

Вот пример.

Это не лучший стиль (не использует 3-аргументную форму open и не использует лексические дескрипторы файлов) , но он должен работать.

use autodie; # Yay! No "or die '' "
use Term::ReadKey;
open(TTYOUT, ">/dev/tty");
print TTYOUT "Password?: ";
close(TTYOUT);
open(TTY, "</dev/tty");
ReadMode('noecho', *TTY);
$password = ReadLine(0, *TTY);
...