Scope::Guard(3) User Contributed Perl Documentation Scope::Guard(3)

# [NAME](#NAME)

Scope::Guard - lexically-scoped resource management

# [SYNOPSIS](#SYNOPSIS)

```
    my $guard = guard { ... };
      # or
    my $guard = scope_guard \&handler;
      # or
    my $guard = Scope::Guard->new(sub { ... });
    $guard->dismiss(); # disable the handler
```

# [DESCRIPTION](#DESCRIPTION)

This module provides a convenient way to perform cleanup or other forms of resource management at the end of a scope. It is particularly useful when dealing with exceptions: the "Scope::Guard" constructor takes a reference to a subroutine that is guaranteed to be called even if the thread of execution is aborted prematurely. This effectively allows lexically-scoped "promises" to be made that are automatically honoured by perl's garbage collector.

For more information, see: &lt;http://www.drdobbs.com/cpp/184403758&gt;

# [METHODS](#METHODS)

## [new](#new)

```
    my $guard = Scope::Guard->new(sub { ... });
      # or
    my $guard = Scope::Guard->new(\&handler);
```

The "new" method creates a new "Scope::Guard" object which calls the supplied handler when its "DESTROY" method is called, typically at the end of the scope.

## [dismiss](#dismiss)

```
    $guard->dismiss();
      # or
    $guard->dismiss(1);
```

"dismiss" detaches the handler from the "Scope::Guard" object. This revokes the "promise" to call the handler when the object is destroyed.

The handler can be re-enabled by calling:

```
    $guard->dismiss(0);
```

# [EXPORTS](#EXPORTS)

## [guard](#guard)

"guard" takes a block and returns a new "Scope::Guard" object. It can be used as a shorthand for:

```
    Scope::Guard->new(...)
```

e.g.

```
    my $guard = guard { ... };
```

Note: calling "guard" anonymously, i.e. in void context, will raise an exception. This is because anonymous guards are destroyed **immediately** (rather than at the end of the scope), which is unlikely to be the desired behaviour.

## [scope\_guard](#scope_guard)

"scope\_guard" is the same as "guard", but it takes a code ref rather than a block. e.g.

```
    my $guard = scope_guard \&handler;
```

or:

```
    my $guard = scope_guard sub { ... };
```

or:

```
    my $guard = scope_guard $handler;
```

As with "guard", calling "scope\_guard" in void context will raise an exception.

# [VERSION](#VERSION)

0.21

# [SEE ALSO](#SEE_ALSO)

- B::Hooks::EndOfScope
- End
- Guard
- Hook::Scope
- Object::Destroyer
- Perl::AtEndOfScope
- ReleaseAction
- Scope::local\_OnExit
- Scope::OnExit
- Sub::ScopeFinalizer
- Value::Canary

# [AUTHOR](#AUTHOR)

chocolateboy &lt;chocolate@cpan.org&gt;

# [COPYRIGHT](#COPYRIGHT)

Copyright (c) 2005-2015, chocolateboy.

This module is free software. It may be used, redistributed and/or modified under the same terms as Perl itself.

2026-10-26 perl v5.44.0

---

Document: Scope::Guard(3pm) from perl-scope-guard 0.21-r12 (Chainguard OS)
Source: https://github.com/chocolateboy/Scope-Guard
