В Perl вы можете сделать обратный вызов в формате замены, используя форму s///e
, где e - оператор eval.
Таким образом, вы просто помещаете вспомогательное имя на стороне замены, проходящей группу захвата номера.
Что касается формата printf, я оставляю это на ваше усмотрение.
Образец Perl
use strict;
use warnings;
$/ = undef;
my $data = <DATA>;
sub Conv
{
my ($num) = @_;
return sprintf( "%g", 2 * $num );
}
$data =~ s/(?<![\d.])([+-]?(?:\d+(?:\.\d*)|\.\d+)(?:[eE][+-]?\d+)?)/Conv($1)/eg;
print $data;
__DATA__
*ABC
315 *15:313 1.111e-05
3232 *41:135 2.222e-06
*DEF
...
...
*ABC
52 *3:1313 3.333e-05
42 *13:753 4.444e-06
*DEF
...
...
Вывод
*ABC
315 *15:313 2.222e-005
3232 *41:135 4.444e-006
*DEF
...
...
*ABC
52 *3:1313 6.666e-005
42 *13:753 8.888e-006
*DEF
...
...
Здесь приведен пример выражения, которое необходимо изменить.
(?<! [\d.] )
( # (1 start)
[+-]?
(?:
\d+
(?: \. \d* )
| \. \d+
)
(?: [eE] [+-]? \d+ )?
) # (1 end)