my $test = "_.4.1\n";
print $test;
my $docid=4;
$test =~ s/_.$docId.1/_.$docId.0/gm;
print $test
我希望看到:这个perl替换出了什么问题?
_.4.1
_.4.0
,但我得到:
_.4.1
_.4.1
my $test = "_.4.1\n";
print $test;
my $docid=4;
$test =~ s/_.$docId.1/_.$docId.0/gm;
print $test
我希望看到:这个perl替换出了什么问题?
_.4.1
_.4.0
,但我得到:
_.4.1
_.4.1
您有一个资本I
在$docId
在你的正则表达式中,但是用小写i
来声明它。 $docid
不被视为与$docId
相同的变量。 Perl区分变量名称中的大写和小写。
你应该总是使用
use strict;
use warnings;
为了防止简单的错误是这样的。
尝试使用-w选项在Perl
_.4.1
Use of uninitialized value $docId in regexp compilation at test.pl line 4.
_.4.1
$docid != $docId;
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";
作为一个简单的habbit,我总是使用perl -w – Nikodemus 2011-12-15 09:21:07
为什么在十年前向Perl添加更灵活和更强大的替代方法`use warnings`时,会使用`-w`? – 2011-12-15 09:59:15