Perl在前一个模式匹配后无法工作

时间:2014-08-16 12:38:01

标签: perl

我遇到一个奇怪的问题,即前一个模式匹配后,运算符s///不起作用。例如

use strict; 
use warnings; 

my $var = "var"; 
$var =~ s||/|g; 

print "$var\n";

输出为:/v/a/r/

但在这种情况下

use strict; 
use warnings; 

my $a = "test"; 

if ($a =~ /te/) { 

    my $var = "var"; 
    $var =~ s||/|g; 

    print "$var\n"; 
}

输出为:var,它应与前一个结果相同。

这里发生了什么?我该如何解决?

1 个答案:

答案 0 :(得分:5)

perlop有关 空模式//

的说法
  

如果PATTERN评估为空字符串,则使用最后一个成功匹配的正则表达式。在这种情况下,只有空模式上的g和c标志才能被尊重;其他标志取自原始模式。如果之前没有匹配,则会(静默地)将其视为真正的空模式(始终匹配)。

所以你的第一种情况是对空字符串进行替换,因为之前没有模式匹配,而第二种情况是在te中成功匹配test之后,所以它替换{{1 te中的任何地方都没有效果。

该程序演示

var

<强>输出

use strict;
use warnings;

my $str = 'a/b/c';

if ($str =~ m{/}) {
  $str =~ s//x/g;
}

print $str;

唯一的例外是axbxc 命令中的模式,如果这是你指定的模式,它总是匹配空模式。

要解决这个问题,如果确实希望匹配每个字符前后的点,您可以使用split修饰符为您的模式使用无关紧要的空间,例如

/x

<强>输出

use strict; 
use warnings; 

my $var_a = 'test'; 

if ($var_a =~ /te/) { 

    my $var_b = 'var'; 
    $var_b =~ s| |/|gx; 

    print "$var_b\n"; 
}