gpt4 book ai didi

Perl 替换在之前的模式匹配后不起作用

转载 作者:行者123 更新时间:2023-12-03 14:30:26 24 4
gpt4 key购买 nike

我有一个奇怪的问题,即替代运算符 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 ,当它应该与之前的结果相同时。

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

最佳答案

perlop 有关于 的说法空模式//

If the PATTERN evaluates to the empty string, the last successfully matched regular expression is used instead. In this case, only the g and c flags on the empty pattern are honored; the other flags are taken from the original pattern. If no match has previously succeeded, this will (silently) act instead as a genuine empty pattern (which will always match).



因此,您的第一个案例对空字符串进行了替换,因为之前没有模式匹配,而第二个案例是在成功匹配 te 之后出现的。在 test ,所以它代替 te无处不在 var所以没有效果。

该程序演示
use strict;
use warnings;

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

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

print $str;

输出
axbxc

唯一的异常(exception)是 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";
}

输出
/v/a/r/

关于Perl 替换在之前的模式匹配后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25340212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com