perl: открыть файловую ручку, записать в нее, дать ей имя позже?


Кажется, я где-то читал, как это делается, но не могу найти, где именно. Возможно, это возможно только в новых (ish) версиях Perl. Я использую 5.14.2:

У меня есть Perl-скрипт, который записывает результаты в файл, если выполняются определенные критерии. Более логично, учитывая структуру скрипта, записать результаты и позже проверить, соблюдены ли критерии сохранения результатов в файл.

Кажется, я где-то читал, что могу записывать содержимое в файловую ручку, которая в Linux, я думаю, будет соответствовать временному файлу или каналу какого-то вида, а затем даст имя этому файлу, включая каталог, где он должен быть, позже. Если нет, то содержимое будет удалено, когда сценарий завершится.

Есть ли простой способ сделать это в Perl, кроме перебора временных файлов и удаления их вручную?

2 2

2 ответа:

Нет простого (UNIX) средства для того, что вы описываете, но поведение может быть составлено из базовых системных операций. Файл Perl:: Temp уже делает большую часть того, что вы хотите:

use File:Temp;

my $tmp = File::Temp->new;      # Will be unlinked at end of program.

while ($work_to_do) {
  print $tmp a_lot_of_stuff();  # $tmp is a filehandle
}

if ($save_it) {
  rename($tmp, $new_file);      # $tmp is also a string.  Move (rename) the file.
}                               # If you need this to work across filesystems, you
                                # might want to ``use File::Copy qw(move)'' instead.

exit;                           # $tmp will be unlinked here if it was not renamed

Для этого я использую File:: Temp.

Но вы должны иметь в виду, что File::Temp удаляет файл по умолчанию. Это нормально, но в моем случае я не хочу этого при отладке. Если скрипт завершается и вывод не является желаемым, я не могу проверить временный файл.

Поэтому я предпочитаю установить $KEEP_ALL=1 или $fh->unlink_on_destroy( 0 );, когда OO или ($fh, $filename) = tempfile($template, UNLINK => 0);, а затем разорвать связь с файлом самостоятельно или переместить в нужное место.

Было бы безопаснее переместить файл после закрытия файла handle (просто в случае, если есть некоторые буферизация продолжается). Поэтому я бы предпочел подход, при котором временный файл не удаляется по умолчанию, а затем, когда все будет сделано, установите условие, которое либо удалит его, либо переместит его в нужное место и имя.