2

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

伪代码:

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

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

2 回答 2

5

您的“如果输入数据”会使事情变得困难。很容易说

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

while (<>) {
    ...
}

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

一种可能的折衷方案是使用-t 运算符来猜测 stdin 是否是终端:

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

如果命令行上没有文件名并且标准输入连接到终端,它将使用“somedefault” ,但如果没有文件名并且标准输入从文件或管道重定向,它将使用标准输入。这有点神奇(也许很烦人),但可以满足您的要求。

于 2012-01-27T01:28:09.863 回答
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);
     }
}

您可以在 perldoc perlop 处阅读有关该$.变量的信息- 它表示从中读取的最新文件句柄的“当前”行号。如果它未定义,则没有可读取的内容。<>

于 2012-01-27T01:39:35.227 回答