You might also like to look at extending the regexp syntax. This adds the new ( ... capture ... )\C{name} element to regular expression syntax. It copies the contents of the last closed capture into the scalar variable named 'name'. So /( [\dA-F]+ ) \C{ hex }/x would copy a hex string to the $hex variable.
use Regexp::NamedCaptures;
$_ = "three - four - five";
/(\w+)\C{baz} - (\w+)\C{qux}/g;
print "baz=$baz, qux=$qux\n";
Regexp::NamedCaptures
Updated: Changed the \N{ ... } to \C{ ... } to not conflict with named characters.
Also changed the return value of convert() so it returns the altered expression instead of the boolean result of the s///.
package Regexp::NamedCaptures;
use overload;
sub import
{
shift;
die "No argument allowed to " . __PACKAGE__ . "::import" if @_;
overload::constant qr => \ &convert;
}
sub convert
{
my $re = shift;
$re =~ s( \\ ( \\ | C\{ (?>\s*) ((?>\w+)) (?>\s*) \} ) )
{
defined $2
? "(?{\$$2=\$^N})"
: "\\"
}xeg;
$re;
}
1;