Se non vi serve conoscere il nome del file, potete usare open() con
undef al posto del nome del file. La funzione open() crea un file
temporaneo anonimo.
open my $tmp, '+>', undef or die $!;
Altrimenti, potete usare il modulo File::Temp.
use File::Temp qw/ filetemp dirtemp /;
$dir = dirtemp( CLEANUP => 1 );
($fh, $nomefile) = filetemp( DIR => $dir );
# oppure, se non avete bisogno del nome del file
$fh = filetemp( DIR => $dir );
File::Temp è un modulo standard fin dal Perl 5.6.1. Se avete
installato un Perl abbastanza recente, usate il metodo di classe
new_tempfile dal modulo IO::File per ottenere un file aperto in
lettura e scrittura. Usate quanto segue se non avete la necessità
di sapere il nome del file:
use IO::File;
$fh = IO::File->new_tmpfile()
or die "Impossibile creare un nuovo file temporaneo: $!";
Se siete costretti a creare un file temporaneo a mano, usate l'ID
del processo e/o il valore dell'ora corrente. Se avete bisogno di
più file temporanei in un unico processo, usate un contatore:
BEGIN {
use Fcntl;
my $dir_temp = -d '/tmp' ? '/tmp' : $ENV{TMPDIR} || $ENV{TEMP};
my $nome_base = sprintf("%s/%d-%d-0000", $dir_temp, $$, time());
sub file_temp {
local *FH;
my $conta = 0;
until (defined(fileno(FH)) || $conta ++ > 100) {
$nome_base =~ s/-(\d+)$/"-" . (1 + $1)/e;
# O_EXCL e` richiesto per ragioni di sicurezza.
sysopen(FH, $nome_base, O_WRONLY|O_EXCL|O_CREAT);
}
if (defined(fileno(FH))) {
return (*FH, $nome_base);
} else {
return ();
}
}
}
|