in reply to Re: scratching the surface of File::Temp
in thread (code) scratching the surface of File::Temp

Like you point out, a, if $fh is used instead of TMP, I lose $filehandle as soon as $fh is closed.   So how can I unlink0 with no $filehandle without generating "Use of uninitialized value @ /usr/local/lib/site_perl/File? line (1525|1584), <STDIN> chunk 1" ?
#!/usr/bin/perl -w use strict; use File::Temp qw(tempfile unlink0 ); use vars qw($fh $filename); my $template = 'fileXXXXXXXXXX'; my $dir = '/tmp/'; ($fh, $filename) = tempfile($template, DIR => $dir) or die "Error creating $filename: $!"; print $fh "\nS'working?\n" or die "Error writing to $filename: $!"; close $fh or die "Error closing $filename: $!"; print "\nUnlinking $filename\n<ENTER> to continue, CTRL+C to abort.\n" +; my $continue = (<STDIN>); unlink0 ($fh, $filename) or die "Error unlinking file $filename safely: $!"
I wouldn't be surprised if it's explained in the module's pod and I'm just not picking up on it.
    striving for Perl Adept
    (it's pronounced "why-bick")

Update: Good monk a says below "not supposed to close $fh... unlink0 will handle..."
A-ha!   that seems to do the trick. 8^)

Update #2: But if I don't "close $fh" then "print $fh "\nS'working?\n" or die;" doesn't really happen.   So I'm still doing something wrong 8^(

  • Comment on Re: (2) scratching the surface of File::Temp (unlink w/o $filehandle ?)
  • Download Code

Replies are listed 'Best First'.
Re: Re: (2) scratching the surface of File::Temp (unlink w/o $filehandle ?)
by a (Friar) on Feb 10, 2001 at 09:55 UTC
    Short answer: I don't think you can. Either you're not supposed to close $fh (unlink0 will handle that) or your first method: open a 2nd link and go from there. One hopes tilly|tye|chipmunk will be along w/ the correct answer real soon now ...


      You have the correct answer. And indeed it is addressed in the documentation. unlink0 performs checks that depend on having both the filename and the open filehandle, and if you do the close yourself it cannot verify that the close was safe.