perl: открыть файловую ручку, записать в нее, дать ей имя позже?
Кажется, я где-то читал, как это делается, но не могу найти, где именно. Возможно, это возможно только в новых (ish) версиях Perl. Я использую 5.14.2:
У меня есть Perl-скрипт, который записывает результаты в файл, если выполняются определенные критерии. Более логично, учитывая структуру скрипта, записать результаты и позже проверить, соблюдены ли критерии сохранения результатов в файл.
Кажется, я где-то читал, что могу записывать содержимое в файловую ручку, которая в Linux, я думаю, будет соответствовать временному файлу или каналу какого-то вида, а затем даст имя этому файлу, включая каталог, где он должен быть, позже. Если нет, то содержимое будет удалено, когда сценарий завершится.
Есть ли простой способ сделать это в Perl, кроме перебора временных файлов и удаления их вручную?
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 (просто в случае, если есть некоторые буферизация продолжается). Поэтому я бы предпочел подход, при котором временный файл не удаляется по умолчанию, а затем, когда все будет сделано, установите условие, которое либо удалит его, либо переместит его в нужное место и имя.