Chr*_*ris 2 unix perl command-line stdin filehandler
我想读取默认输入,如果数据是通过管道输入或提供了文件,但如果没有给出任何内容,我想提供while(<>)执行的默认值.
伪代码:
if(!<>){
<> = system("ls | ./example.pl");
}
while(<>){
...
...
...
}
Run Code Online (Sandbox Code Playgroud)
您的"如果数据通过管道传输"会让事情变得困难.这很容易说
if (!@ARGV) {
@ARGV = ("somedefault");
}
while (<>) {
...
}
Run Code Online (Sandbox Code Playgroud)
如果在命令行上没有给出文件名,它将在"somedefault"上运行 - 但这意味着如果命令行上没有任何文件名,你将永远不会获得从stdin读取的Perl默认值.
一个可能的折衷方案是使用-t运算符来猜测stdin是否是终端:
if (!@ARGV && -t STDIN) {
@ARGV = ("somedefault");
}
Run Code Online (Sandbox Code Playgroud)
如果命令行上没有文件名并且 stdin附加到终端,那么将使用"somedefault" ,但如果没有文件名并且stdin从文件或管道重定向,它将使用stdin.这有点神奇(可能是令人讨厌的),但你做了什么.