2010-10-18 10 views
10

Me gustaría crear un archivo temporal, escribir en el manejador de archivos y luego llamar a un programa externo con el nombre del archivo.¿Cómo debo usar Perl's File :: Temp?

El problema es que normalmente me gustaría close el archivo después de escribir en él y antes de llamar al programa externo, pero si he entendido bien close -ing un tempfile() hace que se puede quitar.

¿Cuál es la solución aquí?

+0

Parece que en realidad no quiere un archivo _temporary_. –

+0

pero yo sí. Llamo al programa externo desde mi script. Una vez hecho, ya no necesito el archivo. –

Respuesta

6

Escribir en el archivo temporal con el almacenamiento en búfer desactivado. Llame al programa externo antes de cerrar el archivo en el script Perl, y el programa externo podrá leer todo lo que haya escrito.

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

Tengo una repulsión incontrolable por el uso de archivos abiertos ... pero parece que funciona. –

+0

Dónde se define '$ template' y qué se define: ni siquiera los documentos oficiales de' File :: Temp' hacen mención de esta escurridiza pieza de mierda. –

+0

Es cualquier cadena que [termina con] (https://metacpan.org/source/DAGOLDEN/File-Temp-0.2304/lib/File/Temp.pm#L256) [4 o más 'X' consecutivas] (https://metacpan.org/source/DAGOLDEN/File-Temp-0.2304/lib/File/Temp.pm#L87) – mob

5

De 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. 

intenta establecer a 0.

0

programación orientada a objetos con interfaz de File::Temp que puede hacer:

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

`cat $cpp`;