2011-12-15 47 views

回答

8

您有一个资本I$docId在你的正则表达式中,但是用小写i来声明它。 $docid不被视为与$docId相同的变量。 Perl区分变量名称中的大写和小写。

你应该总是使用

use strict; 
use warnings; 

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

参见:Why use strict and warnings?

+3

作为一个简单的habbit,我总是使用perl -w – Nikodemus 2011-12-15 09:21:07

+2

为什么在十年前向Perl添加更灵活和更强大的替代方法`use warnings`时,会使用`-w`? – 2011-12-15 09:59:15

-1

尝试使用-w选项在Perl

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


$docid != $docId; 
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";