如果数据是通过管道输入或提供了文件,我想从默认输入读取,但如果没有给出任何内容,我想提供执行while(<>)
的默认值。
伪代码:
if(!<>){
<> = system("ls | ./example.pl");
}
while(<>){
...
...
...
}
答案 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 - 它表示从中读取的最新文件句柄的“当前”行号。如果未定义,则无法从<>
读取任何内容。