---
name: "Perl::Critic::Policy::RegularExpressions::ProhibitCaptureWithoutTest"
section: "3pm"
platform: "linux"
package: "perl-perl-critic"
version: "1.156-3"
release: "Arch Linux 2026-11-01"
platforms: ["linux"]
url: "https://new.carta.tech/Perl::Critic::Policy::RegularExpressions::ProhibitCaptureWithoutTest"
---

# Perl::Critic::Policy::RegularExpressions::ProhibitCaptureWithoutTest(3pm)

Capture variable used outside conditional.

## NAME

Perl::Critic::Policy::RegularExpressions::ProhibitCaptureWithoutTest - Capture variable used outside conditional.

## AFFILIATION

This Policy is part of the core Perl::Critic distribution.

## DESCRIPTION

If a regexp match fails, then any capture variables (`$1`, `$2`, ...) will be unaffected.  They will retain whatever old values they may have had.  Therefore it's important to check the return value of a match before using those variables.

```
    '12312123' =~ /(2)/;
    print $1;    # Prints 2
    '123123123' =~ /(X)/;
    print $1;    # Prints 2, because $1 has not changed.
```

Note that because the values of `$1` etc will be unaffected, you cannot determine if a match succeeded by checking to see if the capture variables have values.

```
    # WRONG
    $str =~ /foo(.+)/;
    if ( $1 ) {
        print "I found $1 after 'foo'";
    }
```

This policy checks that the previous regexp for which the capture variable is in-scope is either in a conditional or causes an exception or other control transfer (i.e. `"next"`, `"last"`, `"redo"`, `"return"`, or sometimes `"goto"`) if the match fails.

A `"goto"` is only accepted by this policy if it is a co-routine call (i.e.  `"goto &foo"`) or a `"goto LABEL"` where the label does not fall between the `"goto"` and the capture variable in the scope of the `"goto"`. A computed `"goto"` (i.e. something like `"goto (qw{foo bar` `baz})[$i]"`) is not accepted by this policy because its target can not be statically determined.

This policy does not check whether that conditional is actually testing a regexp result, nor does it check whether a regexp actually has a capture in it.  Those checks are too hard.

This policy also does not check arbitrarily complex conditionals guarding regexp results, for pretty much the same reason.  Simple things like

```
 m/(foo)/ or die "No foo!";
 die "No foo!" unless m/(foo)/;
```

will be handled, but something like

```
 m/(foo)/ or do {
   ... lots of complicated calculations here ...
   die "No foo!";
 };
```

are beyond its scope.

## CONFIGURATION

By default, this policy considers `"die"`, `"croak"`, and `"confess"` to throw exceptions. If you have additional subroutines or methods that may be used in lieu of one of these, you can configure them in your perlcriticrc as follows:

```
 [RegularExpressions::ProhibitCaptureWithoutTest]
 exception_source = my_exception_generator
```

## BUGS

This policy does not recognize named capture variables. Yet.

## AUTHOR

Chris Dolan \<cdolan@cpan.org\>

## COPYRIGHT

Copyright (c) 2006-2017 Chris Dolan.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
