Вот еще один способ сделать это с помощью позиционной развертки.
Используется позиционная ссылка \ G, которая соответствует либо началу строки, либо позиции после предыдущего совпадения.
#!/usr/bin/perl
use strict; # always strict + warnings
use warnings;
my $count = 1; # start at 1;
while ( my $line = <STDIN> ) { # read stdin
while ( $line =~ /\G.*?(<count>)/g ) { # scan left to right and pick out one <count> at a time.
substr( $line, $-[1], $+[1] - $-[1], $count++ ); # replace the substring and increment
}
print $line;
}
Функционально он практически идентичен опубликованному решению regex-eval, просто он работает без eval. Ранее я публиковал некоторые анти-Eval страха, но это просто FUD из других менее значимых языков, не делая Eval безопасно.
Способ / e эффективно делает это:
replace_callback( \$input, $regex, sub{
return $count++;
});
(Где заменить обратный вызов - какая-то раздутая функция, которая выполняет всю работу)
Что действительно безопасно, как яйца, просто не очевидно, что это так безопасно.