in reply to Re^7: "my" declaration problem
in thread "my" declaration problem
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.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^9: "my" declaration problem
by LanX (Saint) on Apr 25, 2017 at 21:05 UTC | |
by shmem (Chancellor) on Apr 25, 2017 at 21:50 UTC | |
by Corion (Patriarch) on Apr 25, 2017 at 21:20 UTC | |
by LanX (Saint) on Apr 25, 2017 at 21:34 UTC | |
by Anonymous Monk on Apr 25, 2017 at 21:44 UTC | |
by Anonymous Monk on Apr 26, 2017 at 14:34 UTC |