ЖЕМЧУЖНЫЙ САЙТ - cкриптинг на перле Леха ББ ака Alexys Спецвыпуск Xakep, номер #027, стр. 027-026-2 Блочно-табличная структура страниц Ты наверняка замечал, пока лазил по сайтам, что меняется только середина страниц, а их верхушка (логотип, реклама) и низ (опять же реклама и контактные данные) обычно одинаковы. На любом уважающем себя сайте на всех страницах дублируется навигация - согласись, так удобнее лазить по разным разделам. Когда начинаешь делать сайт (относи это к любому сайту), набросай сначала примерный план, что у тебя где будет находиться - здесь навигация, тут контент, в этом месте реклама, а сюда будут засунуты контактные данные. Прикинул? Да, вот еще, намного удобнее, когда переменные, процедуры и функции, которые будут использоваться и другими твоими скриптами, хранятся в отдельном файле. Он должен быть сделан по всем правилам перловых cgi-шников, а вставляться в основной скрипт строкой: require './values.pl' А в файле values.pl (ну или как ты его назовешь), будут находиться самые важные процедуры и переменные, значения которых много где будут нужны. Для любых нужд понадобятся следующие переменные: $mydir='http://'.$ENV{'HTTP_HOST'}; # - указание имени хоста, к которому будет обращаться броузер. $maindir="../html/"; # - относительный путь к html-папке. А самое главное - засунуть процедуру для обработки форм! Без нее нет смысла использовать cgi-шники, ибо просто нечего будет скрипту обрабатывать. # ---------------------------- # function: FormInput # ---------------------------- sub FormInput { local (*qs) = @_ if @_; # заводим локальную переменную, приравниваем ее к переданному функции массиву (в данном случае - к строке запроса) if ($ENV{'REQUEST_METHOD'} eq "GET") { $qs = $ENV{'QUERY_STRING'}; } elsif ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN,$qs,$ENV{'CONTENT_LENGTH'}); } # в этом куске проги мы выясняем, каким методом - POST или GET - мы читаем нашу строку, так как способы передачи данных в этих методах совершено разные @qs = split(/&/,$qs); # здесь мы просто разбиваем строку на массив, ориентируясь на разделитель - амперсанд foreach $i (0 .. $#qs) # организуем цикл, начальное значение - 0, конечное - количество элементов в массиве qs { $qs[$i] =~ s/\+/ /g; # меняем все плюсы в строке на пробелы (поверь, так надо) $qs[$i] =~ s/%(..)/pack("c",hex($1))/ge; # раскодируем юникодовые символы (такие как "%20" - кстати, это обозначает "пробел") ($name,$value) = split(/=/,$qs[$i],2); # а теперь разбиваем значения массива на пары, разделитель - знак "=" if($qs{$name} ne "") { $qs{$name} = "$qs{$name}:$value"; } else { $qs{$name} = $value; } |