Как получить плавающее число между строками и заменить его вычисленным значением в Perl? - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть текстовый файл, который я хочу извлечь плавающим числом в строках и выполнить вычисления, чтобы сделать его другим, чем заменить исходное число.

например, Исходный файл:

    *ABC
    1.111e-05
    2.222e-06
    *DEF
    ...
    ...
    *ABC
    3.333e-05
    4.444e-06
    *DEF
    ...
    ...

Замененный файл (все десятичные числа умножены на 2 и сохранены как новые):

    *ABC
    2.222e-05
    4.444e-06
    *DEF
    ...
    ...
    *ABC
    6.666e-05
    8.888e-06
    *DEF
    ...
    ...

Как мне это сделать в Perl?Я пытался использовать

$_ =~ /(\*ABC)*(\*DEF)/;

, чтобы получить линии между * ABC и * DEF, но это не удалось ...

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

В 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)
0 голосов
/ 04 декабря 2018

Используйте оператор триггера.

perl -lpe '$_ *= 2 if /\*ABC/ .. /\*DEF/ and ! /\*/' filename
  • -p читает входные данные строка за строкой , печатает каждую строку после обработки
  • -l удаляет новые строки из ввода, добавляет их в вывод
  • ! /\*/ исключает *ABC и *DEF строки
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...