循环错误中的perl文件句柄

perl filehandles in loop error

尝试根据文件中存在的匹配将 fastq 文件拆分为多个文件,因此输出文件可能超过 500 个。提供两个输入文件 - 一个用于匹配,另一个用于其他内容 (fastq)。将匹配放在不同的文件中。此代码完美运行,但不能创建超过 502 个文件。上面502,说不能制作文件。那是循环中文件句柄的限制吗?我需要一次创建 > 502 个文件。任何解决方案?谢谢

my @fh_array;
 foreach(@file_names){
    chomp $_;
    local *OUT;
    open (OUT, ">", "$_\.txt") or die "cannot write file";
    push @fh_array, *OUT;

}

    # In for loop, it works
    print $fh_array[0] "Hello";

我认为这不是 Perl 问题。我运行它有1000个文件,没问题。每个进程可以使用 ulimit 显示(并可能设置)打开的文件数。

虽然您的系统可能存在限制,无法同时打开如此多的文件句柄,但事实上这是一种没有必要或非常实用的蛮力解决方案。我敢打赌,如果您只是在需要时打开一个文件,而不是一次打开所有文件,您将不会注意到明显的性能差异。

例如:

write_to_file($file, @lines);

sub write_to_file {
    my ($file, @lines) = @_;
    open my $fh, ">>", $file or die "Cannot open file '$file' for appending: $!";
    print $fh @lines;
}

伪文件句柄不计入打开文件句柄的系统限制。根据您的内存要求,将输出写入内存然后在脚本末尾将内存写入磁盘(一次一个文件)可能是可行的。

例如:

my (@fh_array, %output);
foreach my $file_name (@file_names) {
    $output{$file_name} = '';
    open my $fh, '>', $output{$file_name};
    push @fh_array, $fh;
}

# main part of program, print to handles in @fh_array
... print {$fh_array[185]} "Hello\n" ...

# end of program. Copy from memory to disk with one open fh at a time
close $_ for @fh_array;
foreach my $file_name (keys %output) {
    open my $fh, '>', $file_name;
    print $fh $output{$file_name};
    close $fh;
}

几乎肯定有更好的方法来设计您的程序,而不必同时打开如此多的文件句柄或具有这种额外的复杂性。