I want to be able to do a regex match on a variable and assign the results to the variable itself. What is the best way to do it?
I want to essentially combine lines 2 a
Also, to amplify the accepted answer using the ternary operator to allow you to specify a default if there is no match:
my $match = $variable =~ /(*pattern*).*/ ? $1 : *defaultValue*;
my($variable) = "some string" =~ /(e\s*str)/;
This works because
If the
/g
option is not used,m//
in list context returns a list consisting of the subexpressions matched by the parentheses in the pattern, i.e., ($1
,$2
,$3
…).
and because my($variable) = ...
(note the parentheses around the scalar) supplies list context to the match.
If the pattern fails to match, $variable
gets the undefined value.
You can do substitution as:
$a = 'stackoverflow';
$a =~ s/(\w+)overflow/$1/;
$a
is now "stack"
$variable2 = "stackoverflow";
(my $variable1) = ($variable2 =~ /stack(\w+)/);
$variable1
now equals "overflow"
.
Almost ....
You can combine the match and retrieve the matched value with a substitution.
$variable =~ s/.*(find something).*/$1/;
AFAIK, You will always have to copy the value though, unless you do not care to clobber the original.
I do this:
#!/usr/bin/perl
$target = "n: 123";
my ($target) = $target =~ /n:\s*(\d+)/g;
print $target; # the var $target now is "123"