note
TheDamian
Here's a variation on the above solution,
using named recursive subpatterns and named captures.<br>
Nowadays I write all my non-trivial regexes this way.
<code>
use 5.010;
my $source = 'function convert(beg string, end string, read_date date, step char(6)) returns (date, date, char(1))';
my $matched =
$source =~ m{
\A \s*+
(?<access> private | public )?+ \s*+
(?<keyword> function | report ) \s*+
(?<name> (?&identifier) ) \s*+
(?<params> (?&list) ) \s*+
(returns \s*+ (?<returns> (?&list) ) )?+
\s*+ \z
(?(DEFINE)
(?<identifier> [^\W\d]\w*+ )
(?<list> [(] [^()]*+ (?: (?&list) [^()]*+ )*+ [)] )
)
}xms;
if ($matched) {
my %components = %+;
use Data::Dumper 'Dumper';
say Dumper \%components;
}
else {
say 'parse failed';
}
</code>
which outputs:
<code>
$VAR1 = {
keyword => 'function',
name => 'convert',
params => '(beg string, end string, read_date date, step char(6))',
returns => '(date, date, char(1))',
};
</code>
1218162
1218175