我遇到一个奇怪的问题,即前一个模式匹配后,运算符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
,它应与前一个结果相同。
这里发生了什么?我该如何解决?
答案 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";
}