我有一个条目数组,将在一个大文件中搜索,然后将每个条目写入自己的输出文件。数组因某些条件而异,因此必须是动态的。
以下是我的示例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
..等等。
所以我的问题:我似乎觉得非常尴尬,我必须循环打开每个并循环关闭每个句柄,是否有更优雅的方法来动态打开和关闭文件句柄?
答案 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.