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