Главная страница


ru.cgi.perl

 
 - RU.CGI.PERL ------------------------------------------------------------------
 From : Alexey Kolotygin                     2:5070/268.10  08 Jun 2004  01:32:31
 To : All
 Subject : Странности скрипта
 -------------------------------------------------------------------------------- 
 
 
    Hекоторое время назад писал я движок к сайту. Один из основных его  модулей
 занимался генерацией HTML по шаблону, т.е. обрабатываюся
   темплейтные файлы в которых, заданные тэги изменяются на значения
   переменных, обрабатываются массивы, включения кода, других скриптов
   и т.д. В нем активно юзаются регекспы. Собственно в различае их работы
   на различных версиях и заключается моя проблема.
 
   Вобщем написал.
   Тестил только на Active State Perl v5.6.0 все работало замечательно.
   Hедавно решил использовать его в деле, в налчие имелась ActiveState v5.0.3.
   С ней нижеприведенный проблемный кусок работает неправильно. Снова скачал
 v5.6.0, и как и раньше с ней все зашибись. Попробывал запустить на двух хотингах
 -снова работает неправильно, там Perl v5.6.?.
 
   Вобщем как универсализировать данный фрагмент, чтобы не было проблем с
 размещением в зависимости от версии. Цитировать программу полностью, думаю,
  нет смысла, как и объяснять побробно алгоритм работы. Есть предположение, что
  это из-за вызова рекурсии при открытом регекспе.
 
 ========================================================================
 sub getnext
 {
  my($out,$refstr,$ref)=@_;
  my($pref,$tag,$key,$params,$subcode,$val,$st,$item);
 
  $pref= $refstr ? "[].":"";
 
  $out=~s/(\%\%\s*(\$VAR|\&LIST)\s*=\s*"\Q$refstr$pref\E([^\
 .\[]*?)"(.*?)\%\%)/getvar($2,$3,$4,$ref)/ieog;
 
 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
   Вот этот вредный оператор, то работает то не работает в зависимости от
  версии Перл. По назначению он: Hаходит тэги типа %% $VAR = "var1" %% и заменяет
 на значение функции getvar. Так вот если дело не доходит до рекурсии,
  то все в порядке независимо версии, но если хоть на один шаг в глубь
  (ищет тэги вида %% $VAR = "list[].name" %%) то тут уже в зависимости от версии
  либо работает, либо ничего не меняет, либо все ОК.
 
  Короче не срабатывает регексп при рекурсивном спуске.
 
   while
 ($out=~/(\Q$left_pair$tag_name\E\s*\@LIST\s*=\s*"\Q$refstr$pref\E(.+?)"(.*?)\Q$ 
 right_pair\E(.+)\Q$left_pair$tag_name\E\s*\/\@LIST\s*=\s*"\Q$refstr$pref\E(\2)" 
 \s*\Q$right_pair\E)/igos)
 
   {
      ($tag,$key,$params,$subcode)=($1,$2,$3,$4);
       $val=$ref->{$key};
       undef $st;
       foreach $item (@$val) {
          $st=$st.(getnext($subcode,$refstr.$pref.$key,$item)); <-здесь рекурсия
       }
       $out=~s/\Q$tag\E/$st/igo;
   }
 
  return $out;
 }
 
 ========================================================================
  [ы] Пока, All, счастливого тебе коннекта ! ...
 --- GoldED+/386 1.1.4.7, FastFTN v1.56
  * Origin: Я - демовеpсия Бога от Microsoft! (2:5070/268.10)
 
 

Вернуться к списку тем, сортированных по:

 Тема:    Автор:    Дата:  
 Странности скрипта   Alexey Kolotygin   08 Jun 2004 01:32:31 
Архивное /ru.cgi.perl/2397040c51ac0.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional