在Perl中,如何确定是否存在标准输入?

EDJ*_*EDJ 6 perl stdin

我有一个抓住标准输入的脚本:

&process_input

sub process_input {
    while(<STDIN>) {
       $log_data .= $_;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我运行脚本时:

myscript.pl -param1=a -param2=b
Run Code Online (Sandbox Code Playgroud)

我陷入了这个子程序.如果我这样做,一切都运行正常:

echo "" | myscript.pl -param1=a -param2=b
Run Code Online (Sandbox Code Playgroud)

问题是我如何确定我是否有标准品?我原本以为while()会返回false并且不会运行,但我猜它实际上正等着你输入一些东西,因为它被"卡住"了.

Mva*_*est 18

你想要做的是检查STDIN(STanDard INput)的来源:另一个应用程序或终端.在您的情况下,它是第二个选项,导致读取操作停止进程,直到用户输入内容.有关解决方案,请参阅如何判断STDIN是否连接到Perl中的终端?.

if (-t STDIN) {
    # input attached to terminal and will probably ask user
} else {
    # input from other process
}
Run Code Online (Sandbox Code Playgroud)

还有IO :: Interactive可以做更好/更可靠的检查.