如何让 Perl 对管道输入和键盘输入使用不同的句柄?
我有一个处理管道的 Perl 脚本。在某些时候,我希望脚本暂停并要求用户键盘输入。 我的 $input =
不起作用。它只是从管道中读取下一行。如何让 Perl 使用不同的句柄进行管道输入和键盘输入?
I have a Perl script processing a pipe. At some point, I would like the script to pause and ask for user keyboard input. my $input = <STDIN>;
does not work. It just reads next line from the pipe. How can I make Perl use different handles for pipe input and keyboard input?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您使用的是 Unix 平台,则可以打开一个文件句柄
/dev/tty
(或使用IO::Pty
)。使用 tty 的一个很好的例子是“测试程序是否以交互方式运行”示例:http://pleac.sourceforge.net/pleac_perl/userinterfaces.html
您还应该考虑通过
Term::ReadKey
(在 perlfaq8) - 我认为它可能与 TTY 而不是 STDIO 相关,但我不确定。如果不是,请使用 brian d foy 的回答。这是一个例子。
这不是最好的风格(不使用
open
的 3-arg 形式,也不使用词法文件句柄),但它应该可以工作。If you are on a Unix platform, you can open a filehandle to
/dev/tty
(or useIO::Pty
).A good example of working with tty is in "Testing Whether a Program Is Running Interactively" example here: http://pleac.sourceforge.net/pleac_perl/userinterfaces.html
You should also consider doing password IO via
Term::ReadKey
(described in perlfaq8) - I think it may be tied to TTY instead of STDIO but am not sure. If it isn't, use the TTY+Term::ReadKey solution listed at the end of this SO answer by brian d foy.Here's an example.
It's not the best style (doesn't use 3-arg form of
open
, nor uses lexical filehandles) but it should work.