我有以下示例代码
#!/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";
如果我按原样运行此代码,$ match2将获得值200,因为$ 1从前一个块分配了200。如果$ c =“Size:400 GB”,则$ match2变为400,因为从这里填充$ 1值:$ c =〜/ Size:(\ d +)GB /; 我可以通过输入if语句来解决这个问题 if($ c =〜/ Size:(\ d +)GB /){ $ match2 = $ 1; } 但是,每次刷新1美元的价值是否有更好的方法?
答案 0 :(得分:8)
您必须使用if()
版本。由于您的$c
正则表达式不匹配任何内容,因此无法捕获,因此之前的捕获将保留在原位。根据{{3}}:
注意:Perl中的失败匹配不会重置匹配变量,这就是它 更容易编写代码来测试一系列更具体的案例并记住 最好的比赛。
答案 1 :(得分:2)
使用“匹配列表上下文”来获取捕获(如果有):
my($match2) = $c =~ /Size: (\d+) GB/;
如果匹配失败,$ match2将获得undef值(即它将被“重置”);
答案 2 :(得分:1)
检查比赛:
my $match2;
my $c = "Size: GB";
if( $c =~ /Size: (\d+) GB/ ) {
$match2 = $1;
print "Match2 : $match2\n";
}
否则,您不知道字符串是否与正则表达式匹配。
答案 3 :(得分:1)
如果匹配,您可以使用and
仅设置变量:
my $match2;
$c =~ /Size: (\d+) GB/ and $match2 = $1;
如果没有匹配,$match2
将是未定义的。