|
|
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)
Вернуться к списку тем, сортированных по:
Архивное /ru.cgi.perl/2397040c51ac0.html, оценка из 5, голосов 10
|