<p>尽管它可能不适合您的任务,但Perl的match操作符在列表上下文中返回捕获列表。然后,您可以查看变量,看看它们是否有值</p>
<p>在这个例子中,我使用了<code>/x</code>标志来扩展正则表达式,使空白变得无关紧要,并允许内联注释。这样读起来容易一些,Perl在跨行扩展语句方面比Python宽松得多:</p>
<pre><code>#!perl
use strict;
my $entry = '';
my ($name, $expense, $date_expense, $date_paid) =
$entry =~ m/
^
( .+ ) \s # Name
( (?:\d+\.)?\d{1,3},\d{2} ) \s # Expense
( \d{2}\.\d{2}\.\d{2} ) \s # Date
( \d{2}\.\d{2}\.\d{2} ) # Date Paid
$
/x;
if( defined $name ) {
print <<"HERE";
Name: $name
Expense: $expense
Date: $date_expense
Date Paid: $date_paid
HERE
}
else {
print "No match!";
}
</code></pre>
<p>但是,Perl也支持Python风格的捕获。不依赖于长正则表达式中的捕获位置,而是为每个捕获指定一个带有<code>(?P<label>...)</code>的名称(尽管大多数Perl人会将<code>P</code>省略为<code>(?<label>...)</code>)。捕获名称是<code>%+</code>散列中的键:</p>
<pre><code>#!perl
use strict;
my $entry = 'Test23242asdsa 800,03 23.05.19 22.05.19';
$entry =~ m/
^
(?P<name> .+ ) \s
(?P<expense> (?:\d+\.)?\d{1,3},\d{2} ) \s
(?P<date> \d{2}\.\d{2}\.\d{2} ) \s
(?P<date_paid> \d{2}\.\d{2}\.\d{2} )
$
/x;
if( defined $+{name} ) {
print <<"HERE";
Name: $+{name}
Expense: $+{expense}
Date: $+{date}
Date Paid: $+{date_paid}
HERE
}
else {
print "No match!";
}
</code></pre>