我有以下示例代码
#!/usr/bin/perl
use strict;
use warnings;
my $b = "Size: 200 GB";
if ($b =~ /Size: (\d+) GB/) {
my $match1 = $1;
print "Match1 : $match1\n";
}
my $match2;
my $c = "Size: GB";
$c =~ /Size: (\d+) GB/;
$match2 = $1;
print "Match2 : $match2\n";
Run Code Online (Sandbox Code Playgroud)
如果我按原样运行此代码,$ match2将获得值200,因为$ 1从前一个块分配了200.如果$ c ="Size:400 GB",则$ match2变为400,因为从这里填充$ 1值:$ c =〜/ Size:(\ d +)GB /; 我可以通过if if语句来解决这个问题:if($ c =〜/ Size:(\ d +)GB /){$ match2 = $ 1; 但是,每次刷新1美元的价值是否有更好的方法?
你必须使用该if()版本.由于你的$c正则表达式不匹配任何东西,所以没有完成捕获,所以之前的捕获都留在原地.根据http://perldoc.perl.org/perlre.html#Capture-groups,这种非重置是设计的 :
注意:Perl中的失败匹配不会重置匹配变量,这使得编写测试一系列更具体案例的代码更容易,并记住最佳匹配.