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

时间:2012-01-27 01:17:30

标签: perl unix command-line stdin filehandler

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

伪代码:

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

while(<>){
...
...
...
}

2 个答案:

答案 0 :(得分:5)

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

if (!@ARGV) {
    @ARGV = ("somedefault");
}

while (<>) {
    ...
}

如果在命令行上没有给出文件名,它将在“somedefault”上运行 - 但这意味着如果命令行上没有任何文件名,你将永远不会获得从stdin读取的Perl默认值。

一个可能的折衷方案是使用-t operator来猜测stdin是否是终端:

if (!@ARGV && -t STDIN) {
    @ARGV = ("somedefault");
}

如果命令行上没有文件名,并且 stdin附加到终端,那么将使用“somedefault”,但如果没有文件名并且stdin从文件重定向或者stdin将使用stdin管道。这有点神奇(可能是令人讨厌的),但你做了什么。

答案 1 :(得分:4)

尝试从<>读取,然后在没有读取任何内容的情况下又回到默认状态怎么样?

while (my $line = <>)
{
     do_stuff($line);
}

# if no lines were read, fall back to default data source
if (not $.)
{
     while (my $line = <SOMETHING_ELSE>)
     {
          do_stuff($line);
     }
}

您可以阅读$.变量here, at perldoc perlop - 它表示从中读取的最新文件句柄的“当前”行号。如果未定义,则无法从<>读取任何内容。