Да, возможно открыть несколько дескрипторов для одного и того же файла, но (1) результат может быть не тем, что вы хотите (см. Ниже), и (2) вам действительно нужно это сделать или есть лучший способЧтобы решить вашу большую проблему?
Тем не менее, вот что небольшой эксперимент показал на моей машине с Windows:
Открыть один файл в режиме записи, один файл в режиме добавления :
my $file_name = 'text_write_append.txt';
open(my $fh1, ">", $file_name) or die $!;
open(my $fh2, ">>", $file_name) or die $!;
print $fh1 "foo\n" x 1;
print $fh2 "bar\n" x 2;
print $fh1 "x";
Вторая запись в $fh1
определяет, где остановилась предыдущая запись, топает первую bar
и усекает вторую.Вероятно, не то, что вы хотите.
foo
xar
Откройте оба файла в режиме добавления .
my $file_name = 'text_append_append.txt';
open(my $fh0, ">", $file_name) or die $!; close $fh0; # Create empty file.
open(my $fh1, ">>", $file_name) or die $!;
open(my $fh2, ">>", $file_name) or die $!;
print $fh1 "foo\n" x 1;
print $fh2 "bar\n" x 2;
print $fh1 "x";
Все наши выходные данные присутствуют, но в неправильном порядке.
bar
bar
foo
x
Открытие обоих файлов в режиме добавления без буферизованного вывода .
my $file_name = 'text_append_append_flush.txt';
open(my $fh0, ">", $file_name) or die $!; close $fh0;
open(my $fh1, ">>", $file_name) or die $!; select $fh1; $| = 1; # No buffering.
open(my $fh2, ">>", $file_name) or die $!; select $fh2; $| = 1;
print $fh1 "foo\n" x 1;
print $fh2 "bar\n" x 2;
print $fh1 "x";
Возможно, что вы ожидаете (но обратите внимание, что небуферизованная запись обычно медленнее, чем буферизованная)писать).
foo
bar
bar
x