На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Внимательно изучите правила раздела перед созданием темы
0. ПРИЛАГАЙТЕ СВОИ СКРИПТЫ.
1. Прежде чем создать топик, используйте поиск. Возможно это уже обсуждалось.
2. В топике указывайте ОС, режим работы скрипта (CLI|CGI). Очень желателен вывод лог-файлов и того места, куда у вас назначен вывод данных (STDOUT|STDERR)
3. Помните: вы знаете что вы хотите, а форумчане - нет. Поэтому следуйте простому правилу: грамотный развернутый вопрос - грамотный развернутый ответ.
Модераторы: ANDLL
  
    > Вызов подпрограммы внутри регулярки , Используя в качестве параметров backreference
      Не знал в какой раздел, но решил что все таки ближе к перлу, чем к регуляркам.
      Собственно возник вопрос, как вызвать подпрограмму внутри s///


      Это должно выглядеть что-то вроде этого
      ExpandedWrap disabled
        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. Вариант вначале найти все совпадения, затем вызвать модули, а затем прогнать замену мне не нравится.
        Скорее всего ошибаюсь, но, ИМХО, никак.
        По крайней мере в своих задачах я так и не сумел это реализовать.
        Делал по-другому: передавал функции параметры, а она уже их обрабатывала и возвращала то, что мне нужно.

        Кстати, если речь идет о каком-либо фреймворке, то по личному опыту скажу - такой изврат нельзя делать.
        Все должно быть прозрачно и понятно.

        Т.е. только набор функций и переменных + сам движок, который опять таки на выход дает готовый результат.
          По поводу фреймворка спорить не хочу, просто я считаю что именно шаблон должен определять какие функции движка будут вызываться. (Движок само собой просто набор функций, которые может дергать шаблон) Ну и хочется это делать в понятной манере, куда уж понятнее вставить в код сверстанной страницы вызов функций и переменных?

          Добавлено
          На перлмонкс подсказали решение. Нужно просто использовать ключ /e

          $str =~ s/_(.*?)_/test($1)/ge;
            Хм. Оригиналы эти участники перлмонкс, черт побери... =)

            По поводу функций - согласен на все сто.
            Только хочу дать совет (сам понимаешь - совет не есть руководство к действию): делай изначально прозрачно.
            Т.е. что бы от версии к версии ни ты, ни кто-либо другой не парились с совместимостью переменных и функций.

            Просто есть грустный опыт в этом деле...
              Цитата
              Добавлено
              На перлмонкс подсказали решение. Нужно просто использовать ключ /e

              $str =~ s/_(.*?)_/test($1)/ge;


              забыли "шутку" про system"rm -rf /" :rolleyes:
              это же классика
              1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0210 ]   [ 14 queries used ]   [ Generated: 15.05.24, 00:17 GMT ]