UNIX中的<operator,传递给Perl脚本

Chr*_*ris 3 perl command-line stdin

在评估时if(-t STDIN),<UNIX运算符是否计为STDIN?如果没有,我如何获得该数据?

所以有人打字perl example.pl < testing.txt.这不像通过管道传输的数据ls | ./example.pl.我怎么能得到这种行为?

mob*_*mob 5

测试-p STDIN,检查文件句柄STDIN是否附加到管道.

touch foo
perl -e 'print -p STDIN' < foo            # nothing
cat foo | perl -e 'print -p STDIN'        # 1
Run Code Online (Sandbox Code Playgroud)

但我不确定我理解你的问题.在所有这三种情况中

1.  perl -e 'print $_=<STDIN>' < <(echo foo)
2.  echo foo | perl -e 'print $_=<STDIN>'
3.  perl -e 'print $_=<STDIN>'          # then type "foo\n" to the console
Run Code Online (Sandbox Code Playgroud)

输入是相同的,并且都可以通过STDIN文件句柄访问.在前两种情况下,-t STDIN将评估为false,而在第二种情况下,-p STDIN将为true.

这三种情况之间的行为差​​异很微妙,通常并不重要.显然,第三种情况将等到至少接收到一行输入(以"\n"或EOF结尾).前两种情况之间的差异更为微妙.当程序的输入通过另一个进程的输出进行管道传输时,您在某种程度上受到关于延迟的第一个进程的影响,或者该程序是否缓冲其输出.

也许你可以扩展你所说的意思

perl example.pl < testing.txt
Run Code Online (Sandbox Code Playgroud)

表现得不像

ls | ./example.pl
Run Code Online (Sandbox Code Playgroud)