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

> if I were autogenerating that code ...

Or not using my at all or even better putting each snippet into a block.

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

Replies are listed 'Best First'.
Re^6: "my" declaration problem
by Corion (Patriarch) on Apr 25, 2017 at 20:40 UTC

    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.

      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.