Perl基于命令行参数设置文件句柄

Chr*_*ris 2 unix perl command-line stdin filehandler

我想读取默认输入,如果数据是通过管道输入或提供了文件,但如果没有给出任何内容,我想提供while(<>)执行的默认值.

伪代码:

if(!<>){
  <> = system("ls | ./example.pl");
}

while(<>){
...
...
...
}
Run Code Online (Sandbox Code Playgroud)

hob*_*bbs 5

您的"如果数据通过管道传输"会让事情变得困难.这很容易说

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.这有点神奇(可能是令人讨厌的),但你做了什么.