Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如果不使用“while()”,如何读取STDIN和作为命令行参数传递的文件?_Perl - Fatal编程技术网

Perl 如果不使用“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 如果

演示如何从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
如果不使用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您的帖子在某种程度上回答了自己的问题:可以使用操作符从命令行上命名的文件中读取,然后从标准输入中读取。您希望处理的情况中,有哪一个不是由该运算符处理的?@Timpiere:我希望避免使用默认语法,因为我希望独立处理每个文件,而不是将所有输入聚合为单个文本流。因此,我需要一个不依赖while构造的解决方案。此外,我不想在每一行输入上都测试eof。为什么不想使用eof?@ThisSuitesBlacknot:我只是不想在每一行输入上都测试eof,例如,{unlesseof{…}或{…}继续{ifeof{…}。如果有数千个文件,那就有很多条件,可以通过逐个文件分析输入来完全避免。@user001您是否进行了基准测试并发现了真正的性能瓶颈?@Tim实际上,在大多数系统上,您不需要单独的处理循环,因为您可以将/dev/stdin作为文件发送,第一个循环将把它作为其他文件处理@user001只要发送EOF,您就不必担心检查EOF。这是真的,但是如果该工具应该处理标准输入,无论用户是否在命令行上显式提供/dev/stdin,它都需要在那里执行显式操作。我想它可以将/dev/stdin追加到输入参数列表中。无论如何,我认为指出STDIN文件句柄是预定义的,可以直接使用,而无需将其作为文件打开。正如链接文章中提到的,我希望避免STDIN和文件的单独循环,因为这需要复制代码。假设来自任何一个来源的输入都可以得到相同的处理。我希望能够处理| perl script.pl以及| perl script.pl a b c-等情况。谢谢。@A.Danischewski:当存在多个输入文件时,如何在不检查循环上下文中的eof的情况下执行依赖eof的操作?谢谢。您当然可以将文件处理代码放入子例程中,这样就不必复制大量代码。此外,正如@A.Danischewski所观察到的,您可以将/dev/stdin附加到参数列表中,以在与其他文件相同的循环中处理标准输入。您现在应该有足够的资源来解决这个问题的其余部分。
#!/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 $_
    }
}