Что не так в этой замене perl? - PullRequest
       0

Что не так в этой замене perl?

1 голос
/ 15 декабря 2011
my $test = "_.4.1\n";
print $test;
my $docid=4;
$test =~ s/_.$docId.1/_.$docId.0/gm;
print $test

Я надеялся увидеть:

_. * 4,1 * 1004

_. * 4,0 * 1006

Но я получаю:

_. 4,1

_. 4,1

Ответы [ 3 ]

8 голосов
/ 15 декабря 2011

В вашем регулярном выражении есть заглавная буква I в $docId, но объявите ее строчной буквой i $docid не считается той же переменной, что и $docId. Perl различает прописные и строчные буквы внутри имен переменных.

Вы всегда должны использовать

use strict;
use warnings;

Чтобы предотвратить простые ошибки, подобные этой.

См. Также: Зачем использовать строгие и предупреждения?

1 голос
/ 21 декабря 2011

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";
0 голосов
/ 15 декабря 2011

Попробуйте использовать опцию -w в perl

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


$docid != $docId;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...