如何让Perl为管道输入和键盘输入使用不同的句柄?

时间:2011-01-31 19:10:33

标签: perl input pipe

我有一个处理管道的Perl脚本。在某些时候,我希望脚本暂停并要求用户键盘输入。 my $input = <STDIN>;不起作用。它只是从管道中读取下一行。如何让Perl为管道输入和键盘输入使用不同的句柄?

1 个答案:

答案 0 :(得分:13)

如果您使用的是Unix平台,则可以打开文件句柄/dev/tty(或使用IO::Pty)。使用tty的一个很好的例子是“测试程序是否以交互方式运行”示例:http://pleac.sourceforge.net/pleac_perl/userinterfaces.html

您还应该考虑通过Term::ReadKey进行密码IO(在perlfaq8中描述) - 我认为它可能与TTY相关而不是STDIO,但我不确定。如果不是,请使用this SO answer by brian d foy末尾列出的TTY + Term :: ReadKey解决方案。

这是一个例子。

It's not the best style (doesn't use 3-arg form of open, nor uses lexical filehandles)但它应该有用。

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);