Описание тега fullmetal-alchemist-brotherhood
TXR как awk макрос: мы можем на самом деле сделать это, как введенные операции: получение данных в значения с плавающей точкой, пол их вниз до ближайшего целого числа, умножить на сто, преобразовать в целое число.
Однако, давайте остановимся на миг и поразмыслить, что это может быть плохой идеей, если значения настолько велики, что они не могут быть усечены до ближайшего целого; это текст-мудрый будет правильным для сколь угодно больших значений.
$ txr -е '(на awk (:начало (комплект фут #/и\D+.\д+/))
((МФ tofloat пол toint (* 100))))'
(4567.99, 123.45, мусор 3.1415, 1.0 ...) х
456700 12300 300 100
В фут
переменная-это новая функция; классический awk и не имеет аналогов. А ФС
как ФС
(разделитель полей), фут
означает "поле маркировки": он задает положительное регулярное выражение, которое распознает и извлекает поля, игнорируя несовпадающие вещи между ними.
По иронии судьбы
футов
может напрямую выразить семантику по умолчанию разделитель полей в awk: обрезка начальные и конечные символы новой строки и пробелы из записи и разделения на одну или несколько строк или пробелов. Это в точности эквивалентно просто положительно признавая полей маркеров, состоящий из номера-заготовки! Если на awk былофутов
переменной, он не нужен специальный хак, который применяется приФС
равняется один пробел; дефолт может быть, чтоПС
не установлен, иФК
задано регулярное выражение[ \т\н]+
.
Мы используем простой фут
, который распознает цифры, обязательная десятичная и обязательных цифр. Нет знака, нет дополнительных деталей.
В ПВ
макрос ("карта поля") ставит каждого поля через трубопровод операций. Во-первых, tofloat
функции для преобразования строк в числа с плавающей точкой. Затем пол
усекается до ближайшего целого в сторону отрицательной бесконечности. toint
возвращает нас к Ингер и (* 100)
обозначает частичное применение *
к 100
: функция, которая принимает дополнительные аргументы и умножает 100
своих продуктов. Это частичное применение синтаксиса следует из того, что МФ
аргументы неявно рассматриваются как ОП
синтаксис: TXR сюсюкать явное частичное применение оператора.
С МФ
возвращает ненулевой
результат, действие по умолчанию (ПРН)
ногами к печати обновленную отдых
, который вновь образованному catenating обновленных полях со стандартным ОФС
, состоящий из одного пробела, и вывода ОРС
, которая по умолчанию строки.
Вот способ сделать это численно, но не опираясь на математические вычисления с плавающей точкой. В принципе мы можем извлечь полей с использованием того же регулярного выражения, а затем удалить точки, пока они еще текст. Затем перейдите к Integer и использовать усек целочисленного деления и умножения:
$ txr -е '(на awk (:начало (комплект фут #/и\D+.\д+/))
((МФ (remq #\.) toint (ОТБр @1 100) (* 100))))'
Поскольку целые числа могут быть сколь угодно большими на этом языке, это решение не страдают от проблем из-за цифры большие, но сводит к минимуму обработку текстов.