If I have a match operator, how do I save the parts of the strings captured in the parentheses in variables instead of using $1
, $2
, and so on?
... = m/stuff (.*) stuff/;
What goes on the left?
If I have a match operator, how do I save the parts of the strings captured in the parentheses in variables instead of using $1
, $2
, and so on?
... = m/stuff (.*) stuff/;
What goes on the left?
The trick is to make m// work in list context by using a list assignment:
($interesting) = $string =~ m/(interesting)/g;
This can be neatly extended to grab more things, eg:
($interesting, $alsogood) = $string =~ m/(interesting) boring (alsogood)/g;
@interesting = $string ...
? –
Boniface Use the bracketing construct (...)
to create a capture buffer. Then use the special variables $1
, $2
, etc to access the captured string.
if ( m/(interesting)/ ) {
my $captured = $1;
}
$0
instead. –
Maurita ${^MATCH}
to replace $&
so you didn't get hit with the global performance penalty. Up to v5.18, you had to activate that with the /p
flag (like, m/PATTERN/p
), but with v5.20 and later you get ${^MATCH}
for free. –
Doormat Usually you also want to do a test to make sure the input string matches your regular expression. That way you can also handle error cases.
To extract something interesting you also need to have some way to anchor the bit you're interested in extracting.
So, with your example, this will first make sure the input string matches our expression, and then extract the bit between the two 'boring' bits:
$input = "boring interesting boring";
if($input =~ m/boring (.*) boring/) {
print "The interesting bit is $1\n";
}
else {
print "Input not correctly formatted\n";
}
@strings
goes on the left and will contain result, then goes your input string $input_string
. Don't forget flag g
for matching all substrings.
my @strings=$input_string=~m/stuff (.*) stuff/g;
You can use named capture buffers:
if (/ (?<key> .+? ) \s* : \s* (?<value> .+ ) /x) {
$hash{$+{key}} = $+{value};
}
$& - The string matched by the last successful pattern match (not counting any matches hidden within a BLOCK or eval() enclosed by the current BLOCK).
#! /usr/bin/perl
use strict;
use warnings;
my $interesting;
my $string = "boring interesting boring";
$interesting = $& if $string =~ /interesting/;
${^MATCH}
to replace $&
so you didn't get hit with the global performance penalty. Up to v5.18, you had to activate that with the /p
flag (like, m/PATTERN/p
), but with v5.20 and later you get ${^MATCH}
for free. –
Doormat The usual way to get all the captures is to list assign the result of m//
:
my @matches = /PATTERN/;
Perl v5.26 added the @{^CAPTURE}
variable:
if( /PATTERN/ ) {
print "matches were @{^CAPTURE}\n";
}
© 2022 - 2024 — McMap. All rights reserved.