更清晰的方法来动态打开和关闭文件句柄?

时间:2018-02-15 13:31:47

标签: perl

我有一个条目数组,将在一个大文件中搜索,然后将每个条目写入自己的输出文件。数组因某些条件而异,因此必须是动态的。

以下是我的示例array

use strict;
use warnings;

my @array = ("ABC",
             "DEF",
             "GHI",
             "JKL",
             "MNO",
             "PQR"
             );

所以我创建了一个循环来打开为每个条目创建一个文件句柄。运行我的命令,然后再循环一次以关闭文件句柄。

foreach my $handle(@array) {
        my $output = "OUTPUT_$handle.txt";
           open ($handle, '>', $output) or die "unable to open file $!";
}

#... write to files and do some other fancy stuff ...

foreach $handle(@array) {
           close $handle;
    }

这会创建:OUTPUT_ABC.txt OUTPUT_DEF.txt ..等等。

所以我的问题:我似乎觉得非常尴尬,我必须循环打开每个并循环关闭每个句柄,是否有更优雅的方法来动态打开和关闭文件句柄?

2 个答案:

答案 0 :(得分:1)

我不理解您的担忧,但您可以通过使用语句修饰符使其更简洁。此外,使用autodie编译指示无需检查每个操作的状态

use autodie;

open $_, '>', "OUTPUT_$_.txt" for @array;

...

close for @array;

请注意,如果您在块@array中包装使用{ ... }中的文件句柄的代码,那么当它们超出范围时,它们将被隐式关闭。你只需要确保声明my @array(顺便说一句可怕的标识符)在块内

答案 1 :(得分:0)

您可以使用lexical filehandles

use strict;
use warnings;

my @array = qw/ABC DEF/;

{
    my %fh = map { open my $fh, ">", "OUTPUT_$_.txt"; $_ => $fh } @array;
    print $fh{ABC} "Something...";
}
# Here your filehandles in %fh will be closed already.