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
答案 0 :(得分:8)
您的正则表达式I
中有一个大写$docId
,但请使用小写i
进行声明。 $docid
与$docId
不属于同一个变量。 Perl区分变量名中的大写和小写。
你应该总是使用
use strict;
use 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;