How should I use Perl's File::Temp?

David B picture David B · Oct 18, 2010 · Viewed 7k times · Source

I would like to create a temp file, write to the file-handle then call an external program with the filename.

The problem is I would normally want to close the file after writing to it and before calling the external program, but if I understand correctly close-ing a tempfile() causes it to be removed.

So what is the solution here?

Answer

mob picture mob · Oct 18, 2010

Write to the temp file with buffering turned off. Call the external program before you close the file in the Perl script, and the external program will be able to read everything you have written.

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