Как мне использовать Perl File :: Temp? - PullRequest
11 голосов
/ 18 октября 2010

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

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

Так в чем здесь решение?

Ответы [ 4 ]

9 голосов
/ 18 октября 2010

Запись во временный файл с отключенной буферизацией. Вызовите внешнюю программу, прежде чем закрыть файл в сценарии 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
6 голосов
/ 18 октября 2010

С 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 голосов
/ 21 марта 2019

закрытие лучше, чем промывка, из-за возможного тупика. Файл :: Temp открывается с блокировкой

{
    my $tmp = File::Temp->new(
        UNLINK => 0
    );

    select $tmp;
    say 123;
    select STDOUT;

    # $tmp->flush;
    close $tmp;

    say 'slurp >> ', path($tmp->filename)->slurp;
}

{
    my $tmp = Path::Tiny->tempfile(
        UNLINK => 0
    );

    my $fh = $tmp->filehandle('+>');

    select $fh;
    say 123;
    select STDOUT;

    # $fh->flush;
    close $fh;

    say 'slurp >> ', $tmp->slurp;
}
0 голосов
/ 29 декабря 2017

с ООП интерфейсом File::Temp вы можете сделать:

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

`cat $cpp`;
...