Издательский дом ООО "Гейм Лэнд"СПЕЦВЫПУСК ЖУРНАЛА ХАКЕР #27, ФЕВРАЛЬ 2003 г.

ЖЕМЧУЖНЫЙ САЙТ - 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;

}

Назад на стр. 027-026-1  Содержание  Вперед на стр. 027-026-3