Предполагая, что я должен выполнить эту замену, используя одну замену, каков предпочтительный метод, чтобы избежать этой ошибки:
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;
}
Но еще сложнее, в основном приведенный выше код просто читает из БД, чтобы получить поиск и замену, а затем выполняет их в шаблоне. По-видимому, необходимость запускать этот скрипт дважды с каждым коммитом привела бы к слишком большим накладным расходам... так они говорят...