2010-10-18 5 views
10

Я хотел бы создать временный файл, написать в файл-дескриптор, а затем вызвать внешнюю программу с именем файла.Как использовать Perl файл :: Temp?

Проблемы заключается в том, я обычно хочу close файл после записи в него и перед вызовом внешней программы, но если я правильно понимаю close -ную tempfile() заставляет его быть удален.

Так в чем же тут решение?

+0

Это звучит, как вы на самом деле не нужен файл _temporary_. –

+0

но я. Я вызываю внешнюю программу из своего сценария. После этого мне больше не нужен файл. –

ответ

6

Запись во временный файл с отключенной буферизацией. Перед закрытием файла в скрипте Perl вызовите внешнюю программу, и внешняя программа сможет прочитать все, что вы написали.

use File::Temp qw(tempfile); 
use IO::Handle; 

my ($fh, $filename) = tempfile($template, ...); 

... make some writes to $fh ... 

# flush but don't close $fh before launching external command 
$fh->flush; 
system("/path/to/the/externalCommand --input $filename"); 

close $fh; 
# file is erased when $fh goes out of scope 
+1

У меня есть неконтролируемое отвращение от использования открытых файлов ... но это, похоже, работает. –

+0

Где определяется '$ template' и что он определен: даже официальные документы для' File :: Temp' не упоминают об этом неуловимом куске дерьма. –

+0

Это любая строка, которая [заканчивается] (https://metacpan.org/source/DAGOLDEN/File-Temp-0.2304/lib/File/Temp.pm#L256) [4 или более последовательных 'X'] (https://metacpan.org/source/DAGOLDEN/File-Temp-0.2304/lib/File/Temp.pm#L87) – mob

5

http://perldoc.perl.org/File/Temp.html От:

unlink_on_destroy 

Control whether the file is unlinked when the object goes out of scope. The file is removed if this value is true and $KEEP_ALL is not. 

    1. $fh->unlink_on_destroy(1); 

Default is for the file to be removed. 

Попробуйте установить его в 0.

0

с объектно-ориентированным интерфейсом File::Temp вы можете сделать:

my $cpp = File::Temp->new; 
print $cpp "SOME TEXT"; 
$cpp->flush; 

`cat $cpp`; 
Смежные вопросы