Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Perl] Блоки кода внутри регулярного выражения


Автор: KasMP 21.5.2010, 15:24
Цитата
Прочитать содержимое текстового файла и заменить все вхождения вида 
Цитата
число1 + число2 - число3
 на значения сумм.
Рассматривать только сложение и вычитание, между числами и знаком арифметической операции пробел.
Модификатор /g запрещен, разрешены модификаторы /xmse.

Если арифметическая операция разнесена на 2 строки, то все равно заменить ее значением суммы, но следующей за операцией текст размещать на новой строке:
Код
T1 567 +
13 Т2

переходит в
Код
T1 580
Т2
Программа должна иметь вид:
Код

$_ = <>; # чтение всего файла
s/.../.../[модификаторы]
Все. Ничего больше быть не должно (разве что открытие/закрытие файла и изменение символа, который означает конец строки при чтении файла).


Планирую использовать \G, думаю.

Автор: JackYF 21.5.2010, 22:46
Цитата(KasMP @  21.5.2010,  14:24 Найти цитируемый пост)
Модификатор /g запрещен

Цитата(KasMP @  21.5.2010,  14:24 Найти цитируемый пост)
Все. Ничего больше быть не должно

Итого, циклы запрещены и /g для организации цикла внутри - тоже. Что-то я не понимаю, как в таком случае организовать циклический проход.

Автор: KasMP 22.5.2010, 01:14
Цитата(JackYF @  21.5.2010,  22:46 Найти цитируемый пост)
циклы запрещены

Да, внешние циклы (вне регулярного выражения) запрещены. Видимо, предполагается построить цикл с помощью блоков кода внутри регулярного выражения...
Может быть, рекурсия?

Автор: KasMP 23.5.2010, 10:13
Товарищи, рекурсию организовать никогда не поздно. Но неужели все-таки придется прибегать к этому глупому, неэффективному способу smile ?

Автор: KasMP 10.8.2010, 21:24
Все давно решилось! Женя, спасибо за желание помочь smile!
Цитата(JackYF @  21.5.2010,  22:46 Найти цитируемый пост)
Что-то я не понимаю, как в таком случае организовать циклический проход. 

Очень просто smile .

Будем использовать замену (s///). Заменяющую строку строим с помощью многократной конкатенации.
Идейно возможны две ситуации при просмотре входной строки:
  • видим сумму (например, "3+6-3+4") - конкатенация результирующей строки с eval("3+6-3+4");
  • видим не сумму (например, "34-" или "Привет") - конкатенация результирующей строки с тем, что видим).
Эти две ситуации разграничиваются с помощью "ИЛИ":
Код

(1-ая ситуация) | (2-ая ситуация)

Описание каждой ситуации включает блок if и операцию (конкатенацию), которая выполняется при положительной проверке. Ну и, наконец, все это заключается под * (чтобы выполнялось до тех пор, пока строка не кончится).

Все smile !

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)