Perl 如果不使用“while()”,如何读取STDIN和作为命令行参数传递的文件?
演示如何从STDIN或文件中读取,而不使用null filehandle,即while。然而,我想知道如何处理输入可能来自文件、STDIN或同时来自两者的情况 例如,语法可以处理这种情况,如下例所示:Perl 如果不使用“while()”,如何读取STDIN和作为命令行参数传递的文件?,perl,Perl,演示如何从STDIN或文件中读取,而不使用null filehandle,即while。然而,我想知道如何处理输入可能来自文件、STDIN或同时来自两者的情况 例如,语法可以处理这种情况,如下例所示: $ echo -e 'a\nb\nc' | \ while read x; do echo $x > ${x}".txt"; done; echo "d" | \ perl -e "while(<>) {print;}" {a,b,c}.txt - a b c d 如果
$ echo -e 'a\nb\nc' | \
while read x; do echo $x > ${x}".txt"; done; echo "d" | \
perl -e "while(<>) {print;}" {a,b,c}.txt -
a
b
c
d
如果不使用while,如何执行此操作
我希望避免使用,因为我希望独立处理每个文件,而不是将所有输入聚合为单个文本流。此外,我不想在每一行输入上都测试eof。如果您想独立于其他文件处理每个文件,您应该循环给出的参数,然后依次打开每个文件:
for (@ARGV) {
open(my $fh, '<', $_) || die "cannot open $_";
while (<$fh>) {
... process the file here ...
}
}
# handle standard input
while (<STDIN>) {
...
}
这个问题的答案已经回答了这个问题
@ARGS = '-' if !@ARGV;
for my $qfn (@ARGV) {
open($fh, $qfn);
while (<$fh>) {
...
}
}
这里有一个基于Tim的想法,检查STDIN是否有可以读取非阻塞STDIN的内容。如果您并不真正关心用户从STDIN手动输入数据,但仍然希望能够通过管道将数据重定向到脚本,那么这将非常有用 文件:script.pl $>echo hello world | script.pl 你好,世界
$>script.pl
#!/usr/bin/env perl
use IO::Select;
$s = IO::Select->new();
$s->add(\*STDIN);
if ($s->can_read(0)) { push @ARGV, "/dev/stdin"; }
for (@ARGV) {
open(IN, "<$_") || die "** Error opening \"$_\": $!\n";
while (<IN>) {
print $_
}
}