perl:从文件和/或stdin读取而不使用while(<>)

时间:2015-12-07 06:13:38

标签: perl

对于希望避免有用的while(<>)语法并手动管理文件输入的情况,如何处理从文件列表和/或STDIN读取的操作?要从文件中读取,可以简单地遍历@ARGV,依次打开每个元素(例如,my $file=shift @ARGV; open(my $fh,'<',$file); while(<$fh>) {...}; close($fh);。要从标准输入读取,可以简单地使用while(<STDIN>) { ...}。但是,假设程序员期望通过STDIN和文件参数提供类似类型的数据,每个while循环中的代码体都必须重复。我尝试将STDIN分配给文件句柄(例如my $fh = \*STDIN失败了或者my $fh = *STDIN{IO},我在本网站的其他地方已经看过了。)本质上,我想遍历所有文件以及STDIN并对每个文件的输入进行相同的处理,但没有使用方便的while(<>)语法。你能否勾勒出这个问题的解决方案?谢谢。

2 个答案:

答案 0 :(得分:3)

打开两个arg(如<>使用),你可以做

@ARGS = '-' if !@ARGV;

for my $qfn (@ARGV) {
    open($fh, $qfn);

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

我可以做哪三个{arg open

@ARGV = \*STDIN if !@ARGV;

for my $qfn (@ARGV) {
    my $fh;
    if (ref($qfn)) {
       $fh = $qfn;
    } else {
       open($fh, '<', $qfn);
    }

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

答案 1 :(得分:0)

另一种方法(如果您可以使用CPAN模块)是使用IO::All

将文件读入标量变量:

my $content1 < io('file1');

使用IO :: ALL执行此操作的另一种方法:

my $content2 = io('file1')->slurp;

或者如果你想在一个数组中,每一行作为一个元素:

my @lines = io('file1')->slurp;