Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages


home | help

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

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

       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

       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.

       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:

	exception_source = my_exception_generator

       This policy does	not recognize named capture variables. Yet.

       Chris Dolan <>

       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.

perl v5Perl::Critic::Policy::RegularExpressions::ProhibitCaptureWithoutTest(3)


Want to link to this manual page? Use this URL:

home | help