Guard#

📦 std

Guard - run a piece of code when a scope ends or an object goes away.

use Guard;

{
    scope_guard { print "leaving the block\n" };
    ...
}                       # prints here, however the block is left

my $g = guard { unlink $tempfile };
...
undef $g;               # runs now - or whenever the last copy goes

scope_guard BLOCK runs the block when the enclosing scope is left: at its end, through return, last, or an exception unwinding past it.

guard BLOCK returns an object that runs the block when it is destroyed - when the last reference to it goes away. It can be stored, passed around and kept in a data structure, and the code runs exactly once, when nothing holds it any more. Guard::cancel($guard) disarms one: its code will then never run.

The code runs with $@ saved and restored, so a guard firing while an exception is on its way out does not overwrite it. If the guard’s own code dies, the exception is handed to $Guard::DIED, which by default warns it; the exception never escapes the guard.

This is a native implementation of the CPAN module Guard 1.023; its Guard.pm is used unchanged.

Differences from upstream#

One, where perl 5.44 with Guard.xs fails: Guard::cancel(\1) - a reference to a plain number or undef - dies “Guard::cancel called on a non-guard object”, as for every other non-guard; perl5 reads past the value and crashes some of the time (t/81-xs-native/Guard/300-guard-surface.t).

Functions#

Other Functions#

scope_guard#

scope_guard BLOCK: run BLOCK when the enclosing scope is left - at its end, by return, last/next, or an exception passing through. Several in one scope run in reverse order of creation. Exported by default.

guard#

guard BLOCK: an object that runs BLOCK when it is destroyed, that is when the last reference to it goes away - so the code’s lifetime can be tied to a data structure rather than a scope. Exported by default.

cancel#

Guard::cancel($guard): disarm a guard object made by guard - its code will never run. Anything else dies “Guard::cancel called on a non-guard object”. Not exported; it is also the method $guard->cancel.