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.
In reply to Re^8: "my" declaration problem
by Corion
in thread "my" declaration problem
by Hosen1989
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |