Perl while循环打印来自不同来源的行

Perl while loop to print lines from different sources

我有一个 while 循环,它应该从 STDIN 或文件中读取行。

但是,我不确定是否可以在 while 循环中包含 if 语句以使其从 STDIN 或文件中读取行。

有没有办法在循环运行时操纵哪些线路(例如,线路来自哪里)?

例如,我设置了一些关键字以根据提供的行参数和打开的文件来读取行来了解输入的来源。

我知道解决这个问题的方法之一可能是先将 STDIN 放入数组中。解决方案应该不是用户数组。

if ($argCount == 1) {
    $keyword = "input";
}
else {
    $keyword = "file";
    open ($out, '<', "temp.txt") or die "Cannot open file";
}

while ( ($line = <STDIN> && &keyword eq "input") || ($line = <$out> && $keyword eq "file") ) {
    print "$line\n";
    # do something with lines
}
     

在上面的例子中,如果是STDIN,那么它只打印第一行,不会再移动;如果是文件,那么它只是在等待 STDIN 上的输入。我确定这不是正确的方法。

预期输出将打印出来自 STDIN 或文件的所有行。如果关键字设置为“input”,则 $line = <STDIN> 并打印来自 STDIN 的所有行。如果关键字设置为“文件”,则 $line = <$out> 并打印文件中的所有行。

my $fh;
if (...) {
   $fh = \*STDIN;
} else {
   open($fh, '<', ...)
      or die(...);
}

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

也就是说,您应该只是使用

while (<>) {
   ...
}

如果在命令行中提供文件名,将使用文件名。如果没有,将使用 STDIN。