Я практикую вопрос регулярного выражения 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' не будет работать. Использование оператора подстановки казалось самым простым подходом, но я не думаю, что смогу его использовать.
Я не совсем уверен, какие еще методы я мог бы использовать для решения этой проблемы. Любые идеи будут очень признательны.