这个perl替换出了什么问题?

时间:2011-12-15 09:13:17

标签: regex perl

my $test = "_.4.1\n";
print $test;
my $docid=4;
$test =~ s/_.$docId.1/_.$docId.0/gm;
print $test

我希望看到:

_。4.1

_。4.0

但我明白了:

_。4.1

_。4.1

3 个答案:

答案 0 :(得分:8)

您的正则表达式I中有一个大写$docId,但请使用小写i进行声明。 $docid$docId不属于同一个变量。 Perl区分变量名中的大写和小写。

你应该总是使用

use strict;
use warnings;

为了防止这样的简单错误。

另请参阅:Why use strict and warnings?

答案 1 :(得分:1)

Perl 5.10有一个很好的功能,可以让这个问题更容易。替换运算符的模式部分中的\K告诉它在\K之前不替换任何内容。这样,您可以使模式找到您想要更改的位,但只能替换不会更改的部分:

use v5.10;
use strict;
use warnings;

my $test = "_.4.1";
say $test;

my $docId=4;
$test =~ s/_\.$docId\.\K1/0/;

say $test;

我删除了/g/m标记,因为它们在您的示例中没有执行任何操作。

如果您还没有使用v5.10(现在它是不受支持的版本之一),您可以获得相同的效果,并带有正面的后视(只要它是一个恒定的宽度模式):

use strict;
use warnings;

my $test = "_.4.1";
print "$test\n";

my $docId = 4;
$test =~ s/(?<=_\.$docId\.)1/0/;

print "$test\n";

答案 2 :(得分:-1)

尝试在perl中使用-w选项

_.4.1
Use of uninitialized value $docId in regexp compilation at test.pl line 4.
_.4.1


$docid != $docId;