Perl Regex - конвертировать несколько десятичных чисел в строке в ближайшее целое число - PullRequest
0 голосов
/ 10 ноября 2018

Я практикую вопрос регулярного выражения Perl, где у меня есть строки в следующем формате, которые читаются из стандартного ввода:

Я купил 2,3 кг апельсинов за $ 13,50.

Требуется 4,5 часа, чтобы добраться от города до моря.

Она переехала в 2010 году, а ушла в 2014 году.

И мне нужно преобразовать все десятичные числа в каждой строке в их ближайшее целое число. Таким образом, ожидаемый результат будет выглядеть так:

Я купил 2 кг апельсинов за 14,00 $.

Требуется 5 часов, чтобы добраться от города до моря.

Она переехала в 2010 году и уехала в 2014 году.

У меня есть следующий код:

#!/usr/bin/perl -w
use strict;
use warnings;
use Math::Round;

my @lines = <STDIN>; 
chomp @lines;

foreach my $line (@lines) {
    $line =~ s/(\d+\.?\d*)/hello/g;
}

Часть, которую я не уверен, как это сделать, на самом деле заменить десятичные числа в каждой строке их целочисленной версией. Мой подход состоит в том, чтобы прочитать все строки из stdin в массив, а затем для каждого совпадения в каждой строке подставить десятичное число с ближайшим целым числом. Я знаю, что вы можете округлять числа с плавающей запятой в Perl, используя функцию round ().

Однако использование функции round () в качестве текста замены внутри 's / (\ d +.? \ D *) // g' не будет работать. Использование оператора подстановки казалось самым простым подходом, но я не думаю, что смогу его использовать. Я не совсем уверен, какие еще методы я мог бы использовать для решения этой проблемы. Любые идеи будут очень признательны.

1 Ответ

0 голосов
/ 10 ноября 2018

Используйте s///e, чтобы поместить код в качестве выражения замены. Ожидается, что код вернет значение для использования в качестве замены.

 s/(\d+\.\d+)/ sprintf("%.0f", $1) /eg

(Не стесняйтесь использовать Math :: Round's round, если хотите. Я только что использовал то, с чем я знаком.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...