有没有像冲洗正则表达式匹配特殊变量?

时间:2011-10-25 19:14:28

标签: perl

我有以下示例代码

#!/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美元的价值是否有更好的方法?

4 个答案:

答案 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将是未定义的。