Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.167.196] |
|
Сообщ.
#1
,
|
|
|
Не знал в какой раздел, но решил что все таки ближе к перлу, чем к регуляркам.
Собственно возник вопрос, как вызвать подпрограмму внутри s/// Это должно выглядеть что-то вроде этого sub test{ my $value=shift; print $value; return 'la-la-la' ; } my $str = 'Hello _world_'; $str =~ s/_(.*?)_/&test(\1)/g; То есть я хочу вызвать процедуру и передать ей бакреференсы в качестве параметров, для замены найденного выражения. На выходе очевидно, хочется получить в $str "Hello la-la-la". Как написать подобную регулярку? PS: Возможно, у меня XY проблема. Это нужно для моего веб-фреймворвка, я хочу писать в шаблоне что-то типа <body>{_SomeModule_}</body> И вставить выход из модуля SomeModule в указанное место, и хочется это делать как то вроде s/{_(.*?)-}/&callModule(\1)/g. Вариант вначале найти все совпадения, затем вызвать модули, а затем прогнать замену мне не нравится. |
Сообщ.
#2
,
|
|
|
Скорее всего ошибаюсь, но, ИМХО, никак.
По крайней мере в своих задачах я так и не сумел это реализовать. Делал по-другому: передавал функции параметры, а она уже их обрабатывала и возвращала то, что мне нужно. Кстати, если речь идет о каком-либо фреймворке, то по личному опыту скажу - такой изврат нельзя делать. Все должно быть прозрачно и понятно. Т.е. только набор функций и переменных + сам движок, который опять таки на выход дает готовый результат. |
Сообщ.
#3
,
|
|
|
По поводу фреймворка спорить не хочу, просто я считаю что именно шаблон должен определять какие функции движка будут вызываться. (Движок само собой просто набор функций, которые может дергать шаблон) Ну и хочется это делать в понятной манере, куда уж понятнее вставить в код сверстанной страницы вызов функций и переменных?
Добавлено На перлмонкс подсказали решение. Нужно просто использовать ключ /e $str =~ s/_(.*?)_/test($1)/ge; |
Сообщ.
#4
,
|
|
|
Хм. Оригиналы эти участники перлмонкс, черт побери... =)
По поводу функций - согласен на все сто. Только хочу дать совет (сам понимаешь - совет не есть руководство к действию): делай изначально прозрачно. Т.е. что бы от версии к версии ни ты, ни кто-либо другой не парились с совместимостью переменных и функций. Просто есть грустный опыт в этом деле... |
Сообщ.
#5
,
|
|
|
Цитата Добавлено На перлмонкс подсказали решение. Нужно просто использовать ключ /e $str =~ s/_(.*?)_/test($1)/ge; забыли "шутку" про system"rm -rf /" это же классика |