当前位置:  开发笔记 > 编程语言 > 正文

如何在不使用select的情况下检查(查看)Perl中的管道数据的STDIN?

如何解决《如何在不使用select的情况下检查(查看)Perl中的管道数据的STDIN?》经验,为你挑选了2个好方法。

我正在尝试处理没有参数和管道数据传递给Perl脚本的可能性.我假设如果没有参数,则输入通过STDIN进行管道传输.但是,如果用户没有提供任何参数并且没有将任何内容传递给脚本,它将尝试获取键盘输入.我的目标是提供错误消息.

不幸的是,select()不能移植到某些非POSIX系统.还有另一种方法可以实现最大的可移植性吗?



1> pjf..:

Perl附带了-t文件测试运算符,它告诉您特定的文件句柄是否对TTY开放.所以,你应该能够做到这一点:

if ( -t STDIN and not @ARGV ) {
    # We're talking to a terminal, but have no command line arguments.
    # Complain loudly.
}
else {
    # We're either reading from a file or pipe, or we have arguments in
    # @ARGV to process.
}

快速测试表明,在Windows上使用Perl 5.10.0和使用Perl 5.8.8的Linux可以正常工作,因此它应该可以在最常见的Perl环境中移植.

正如其他人所提到的那样,select并不是一个可靠的选择,因为有时您可能正在阅读一个流程,但该流程尚未开始编写.

祝一切顺利,

保罗



2> ysth..:
use POSIX 'isatty';
if ( ! @ARGV && isatty(*STDIN) ) {
    die "usage: ...";
}

请参阅:http://www.opengroup.org/onlinepubs/009695399/functions/isatty.html

请注意,select无论如何都不会有太大帮助,因为如果管道信息尚未准备就会产生错误的结果.例:

seq 100000|grep 99999|perl -we'$rin="";vec($rin,fileno(STDIN),1)=1;print 0+select($rin,"","",.01)'

推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有