如果数据通过管道输入或提供了文件,我想从默认输入中读取,但如果没有给出任何内容,我想提供一个默认值while(<>)
来执行。
伪代码:
if(!<>){
<> = system("ls | ./example.pl");
}
while(<>){
...
...
...
}
如果数据通过管道输入或提供了文件,我想从默认输入中读取,但如果没有给出任何内容,我想提供一个默认值while(<>)
来执行。
伪代码:
if(!<>){
<> = system("ls | ./example.pl");
}
while(<>){
...
...
...
}
您的“如果输入数据”会使事情变得困难。很容易说
if (!@ARGV) {
@ARGV = ("somedefault");
}
while (<>) {
...
}
如果命令行上没有给出文件名,它将在“somedefault”上运行——但这意味着如果命令行上没有任何文件名,你将永远不会获得从标准输入读取的 Perl 默认值。
一种可能的折衷方案是使用-t 运算符来猜测 stdin 是否是终端:
if (!@ARGV && -t STDIN) {
@ARGV = ("somedefault");
}
如果命令行上没有文件名并且标准输入连接到终端,它将使用“somedefault” ,但如果没有文件名并且标准输入从文件或管道重定向,它将使用标准输入。这有点神奇(也许很烦人),但可以满足您的要求。
尝试从 读取<>
,然后如果没有读取任何内容,然后回退到您的默认值怎么样?
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 处阅读有关该$.
变量的信息- 它表示从中读取的最新文件句柄的“当前”行号。如果它未定义,则没有可读取的内容。<>