В Perl ошибка «Использование неинициализированного значения в итераторе подстановки» для переменной $ 1
Работа на примере, найденном еще гдеstackoverflow.com Я пытаюсь заменить N-й экземпляр соответствия регулярному выражению на строку в Perl. Мой код выглядит следующим образом:
#!/usr/bin/env perl
use strict;
use warnings;
my $num_args = $#ARGV +1;
if($num_args != 3) {
print "\nUsage: replace_integer.pl occurance replacement to_replace";
print "\nE.g. `./replace_integer.pl 1 \"INTEGER_PLACEHOLDER\" \"method(0 , 1, 6);\"`";
print "\nWould output: \"method(INTEGER_PLACEMENT , 1, 6);\"\n";
exit;
}
my $string =$ARGV[2];
my $cont =0;
sub replacen {
my ($index,$original,$replacement) = @_;
$cont++;
return $cont == $index ? $replacement: $original;
}
sub replace_quoted {
my ($string, $index,$replacement) = @_;
$cont = 0; # initialize match counter
$string =~ s/[0-9]+/replacen($index,$1,$replacement)/eg;
return $string;
}
my $result = replace_quoted ( $string, $ARGV[0] ,$ARGV[1]);
print "RESULT: $result\n";
За
./replace_integer.pl 3 "INTEGER_PLACEHOLDER" "method(0, 1 ,6);"
Я ожидаю выход
RESULT: method(0, 1 ,INTEGER_PLACEHOLDER);
К сожалению, я получаю вывод
RESULT: method(, ,INTEGER_PLACEHOLDER);
С этими предупреждениями / ошибками
Use of uninitialized value in substitution iterator at ./replace_integer.pl line 26.
Use of uninitialized value in substitution iterator at ./replace_integer.pl line 26.
Строка 26 - это следующая строка:
$string =~ s/[0-9]+/replacen($index,$1,$replacement)/eg;
Я решил, что это из-за неинициализации 1 доллара. Насколько я понимаю, $ 1 должен иметь значение последнего совпадения. Учитывая мое очень простое регулярное выражение ([0-9]+
) Я не вижу причин, по которым его следует инициализировать.
Я знаю, что есть более простые способы найти и заменить N-й экземпляр в sed, но мне потребуются ссылки на Perl вперед и назад, когда это препятствие преодолено (не поддерживается sed)
Кто-нибудь знает причину этой ошибки и как ее исправить?
Я использую Perl v5.18.2, созданный для x86_64-linux-gnu-thread-multi
Спасибо за ваше время.