http://www.perlmonks.org?node_id=57350


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

How come you don't use $fh? I'd've thought
($fh, $filename) = tempfile($template, DIR => $dir) or die " $progname: Error creating $filename: $!";
would be mean ... ah. $fh is usable, so:
print $fh "\nS'working?\n" or die "$progname: Error writing to $filename: $!"; close ($fh) or die "$progname: Error closing $filename: $!"; print "Printed data to $filename\n";
works but once you close ($fh), its gone. By open(TMP, $filename .. you get a 2nd link and you can open and close TMP and still have the tmpfile $filename to work w/. On winx, I needed to $| = 1 for $fh|TMP to have any content in it (that I could see from another process), and if I *don't* close TMP the file is left around afterwards. I suppose this is what its supposed to do ... be good for semaphore files, hmm 'cept for its effort at unique file names might make expecting one difficult. The template'd work for that though.

a

Replies are listed 'Best First'.
Re: (2) scratching the surface of File::Temp (unlink w/o $filehandle ?)
by ybiC (Prior) on Feb 10, 2001 at 09:45 UTC
    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?Temp.pm 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.
        cheers,
        Don
        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^(

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

      a

        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.