Предполагая, что я должен выполнить эту замену, используя одну подстановку, какой метод предпочтительнее избежать этой ошибки:
Use of uninitialized value $2 in concatenation (.) or string at -e line 1.
С этим кодом Perl:
perl -e 'use strict;use warnings;my $str="a";$str=~s/(a)|(b)/$1foo$2/gsmo;'
Цельздесь нужно либо напечатать «afoo», либо «foob» в зависимости от того, что содержит $str
.
Я могу использовать no warnings;
, но потом я боюсь, что пропущу другие «настоящие» предупреждения.Я также знаю, что использование одного паттерна делает это запутанным, но мой реальный паттерн намного сложнее.
Если вам интересно, фактические замены ближе к:
#!perl
my $search = q~(document\.domain.*?</script>)|(</head>)~;
my $search_re = qr/$search/smo;
my $replace = q("$1
<script src=\"/library.js\"></script>
$2");
while (<*.tmpl>) {
my $str = fead_file($_);
$str =~ s/$search_re/$replace/gee;
}
Но еще сложнее, в основномПриведенный выше код просто читает из БД, чтобы найти и заменить, а затем выполняет их в шаблон.Запуск этого сценария дважды с каждым коммитом привел бы к чрезмерным накладным расходам, по-видимому ... так говорится в них ...