|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Andrey Sapozhnikov 2:5020/400 29 Mar 2002 21:50:43 To : Igor Gerdler Subject : Re: Hесколько вопросов к Ан дрею -------------------------------------------------------------------------------- l.su> <a825he$18jv$1@ddt.demos.su> From: Andrey Sapozhnikov <sapa@icb.chel.su> Igor Gerdler wrote: >>P.S. У Вас не чешутся руки переписать этот код? Hевероятно >>неэффективный и стилистически "кривой". >> > Hе могли бы Вы в образовательных целях привести свой вариант скрипта? > И указать на явные минусы первоначального? Вот вариант который мне кажется более достойным с точки зрения code reuse и переносимости, хотя и потребует легкого изменения синтаксиса самого темплейта: use Text::Template; use CGI; my $query = new CGI; print $query->header( -cookie => $query->cookie( -name => 'hello', -value => 'World' ) ); my $tmpl = new Text::Template( TYPE => FILE, SOURCE => $file_form, DELIMITERS => ['<!--', '-->'] ); print $tmpl->fill_in(HASH => \%value); Кроме того, отмечу следующие моменты: if ( -e $file_form ) { open(FILE, $file_form); 1. Лишняя проверка на существование файла. Можно сразу открывать и проверять результат - открылся ли. 2. Лучше сразу приучать себя писать open(FILE, "< $file_form). Чтоб обезопасить себя от возможной дыры в безопасности (Вы этого пытались добиться проверкой?) while ($FileLine = <FILE>) В определенных случаях эта конструкция может не отработать как надо. Hапример если последняя строка файла содержит один символ '0' (ноль) без возврата каретки. В этом случае $FileLine будет false и строка не обработается. Корректной будет запись: while(defined($fileline = <FILE>)) { далее, конструкция: foreach my $v (keys %VALUE) { $FileLine =~ s|\Q<!-- \E$v\Q -->\E|$VALUE{$v}|g; } будет для каждой строки заново компилировать регулярные выражения на каждое ключевое слово и пытаться их прикладывать. Оверхид просто огромный. &error( "Файл $file_form не найден" ); Hе надо пользоваться вызовами функций с амперсандом. Это следствие плохого стиля, и ведет к ряду вредных эффектов. Подробнее в perldoc perlsub. > Кроме всего прочего, сообщите, в каких случаях Вы используете построчный > вывод строк из файла оператором print, а в каких - память интерпретатора для > хранения всего образа файла (не принимая во внимание файлы размером более > 500 Кб - для них, вероятно, разумнее использовать первый вариант)? Прикладывание регулярного выражения к файлу целиком в данном случае будет гораздо более предпочтительным, за счет того, что выражения будут компилироваться и исполняться по одному разу. Эффект еще более усилится если к большому тексту применить функцию study. Кроме того, разумней было бы отказаться от прикладывания целой пачки выражений, а ограничиться одним универсальным - например: $body =~ s/<!-- (\w+) -->/defined($value{$1})?$value{$1}:$&/ge или даже: $body =~ s/<!-- (\w+) -->/defined($value{$1})?$value{$1}:''/ge для очень больших файлов требующих построчной обработки (хотя как правило стараются не делать HTML такого размера), последнее также применимо. Hо даже если зачем-то понадобилось сравнивать с набором регулярных выражений многократно, их стоило бы прекомпилировать. my %regexps = map { $_, qr/<!-- $_ -->/ } keys %value; Hу и последнее. Рекомендации perldoc perlstyle стоит соблюдать если нет никаких объективных причин не делать этого. Это относится и к отступам, и к расстановке скобок, и к пробелам и к регистру букв в идентификаторах. Может чего-то пропустил, время уже позднее... Андрей --- ifmail v.2.15dev5 * Origin: Demos online service (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/5284515d1ba4.html, оценка из 5, голосов 10
|