in reply to Re^5: "my" declaration problem
in thread "my" declaration problem

Not really.

Not using my would make the first $atexit trigger immediately instead of when leaving the sub frobnicate.

Putting things in their own blocks would make it impossible to use $name or whatever other effect of creating the file, and also would trigger the $atexit block when leaving that block instead of when leaving that function.

Replies are listed 'Best First'.
Re^7: "my" declaration problem
by LanX (Saint) on Apr 25, 2017 at 20:53 UTC
    I didn't know or used Guard.pm and have my doubts ...

    Cheers Rolf
    (addicted to the Perl Programming Language and ☆☆☆☆ :)
    Je suis Charlie!

      You can replace the use of Guard by the following class:

      package Guard; sub DESTROY { $_[0]->() }; sub guard (&) { bless $_[0] => __PACKAGE__ };

      Here is the complete program, without that scary XS:

      package Guard; sub DESTROY { $_[0]->() }; package main; use File::Temp 'tempfile'; sub guard (&) { bless $_[0] => 'Guard'; }; sub frobnicate { my ($fh,$name) = tempfile(); print {$fh} "Hello"; close $fh; my $atexit = guard { print "Removing '$name'"; unlink $name; }; my ($fh,$name) = tempfile(); print {$fh} "World"; close $fh; my $atexit = guard { print "Removing '$name'"; unlink $name; }; print "Important processing here"; } print "Frobnicating"; frobnicate(); print "Frobnicating done, and cleaned up"; __END__ Frobnicating Important processing here Removing 'C:\Users\Corion\AppData\Local\Temp\w2guL0aAIx' Removing 'C:\Users\Corion\AppData\Local\Temp\mtR1B1FxN3' Frobnicating done, and cleaned up

      I think Guard lives in a very similar incarnation in some other module whose name escapes me. Maybe tilly wrote it, and I think another similar one was posted recently on blogs.perl.org.

      Update: The blogs.perl.org incarnation is Golang's 'defer' in Perl.

      tillys module is ReleaseAction. There also are AtExit, and its SEE ALSO section provides lots of other, similar modules.

        How is it possible that $atexit holds 2 objects which are both destroyed at scopes end?

        Even if this somehow works, then it's highly implementation dependent and could break in a future Perl version.

        Cheers Rolf
        (addicted to the Perl Programming Language and ☆☆☆☆ :)
        Je suis Charlie!