В 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

Спасибо за ваше время.

Ответы на вопрос(2)

Ваш ответ на вопрос