Получение параметров среды окружения

И все-таки главная задача CGI-скриптов получать от клиента и обрабатывать параметры. Этот пример как раз и демонстрирует средства реализации этой функции в Perl . Список стандартных параметров вы можете найти в справочных материалах. Эта программа просто генерирует HTML-документ со списком значений всех параметров, полученных в запросе.

#!/usr/bin/perl
sub urldecode{
local($val)=@_;
$val=~s/\+/ /g;
$val=~s/%([0-9A-H]{2})/pack('C',hex($1))/ge;
return $val;
}

Это одна из самых важных функций, которая встречается практически в каждом скрипте. Она переводит строку запроса из закодированного для передачи в URL формата в обычный. Подробнее о URL формате в справочных материалах. Реализовано при помощи оператора подстановки: сначала в строке все плюсы заменяем на пробелы, а затем раскодируем все символы, записанные в шестнадцетиричном коде.

print "Content-Type: text/html\n\n";
print " <HTML> <HEAD> <TITLE>CGI-Vraiables </TITLE> </HEAD>\n";
print " <BODY>\n";

Это необходимая "головная" часть генерируемой страницы.

print "Ваш запрос: $ENV{'REQUEST_STRING'} <BR>\n";
print "Декодированный запрос: ";
print "&urldecode($ENV{'REQUEST_STRING'})";

Под параметры в Perl выделяется специальный хэш %ENV, в котором ключами являются имена переменных, а данными их значения. Таким образом, эта часть программы выводит строку запроса и ее же декодированную при помощи функции urldecode.

print " <BR>\n";
print " <HR>\n";
print "Переменные CGI: <BR>\n";
print " <B>REQUEST_METHOD </B>=$ENV{'REQUEST_METHOD'} <BR>\n";
print " <B>QUERY_STRING </B>=$ENV{'QUERY_STRING'}
\n"
;
print " <B>CONTENT_LENGTH </B>=$ENV{'CONTENT_LENGTH'}
\n"
;
print " <B>GATEWAY_INTERFACE </B>=$ENV{'GATEWAY_INTERFACE'} <BR>\n";
print " <B>REMOTE_ADDR </B>=$ENV{'REMOTE_ADDR'} <BR>\n";
print " <B>REMOTE_HOST </B>=$ENV{'REMOTE_HOST'} <BR>\n";
print " <B>SCRIPT_NAME </B>=$ENV{'SCRIPT_NAME'} <BR>\n";
print " <B>SCRIPT_FILENAME </B>=$ENV{'SCRIPT_FILENAME'} <BR>\n";
print " <B>SERVER_NAME </B>=$ENV{'SERVER_NAME'} <BR>\n";
print " <B>SERVER_PORT </B>=$ENV{'SERVER_PORT'} <BR>\n";
print " <B>SERVER_PROTOCOL </B>=$ENV{'SERVER_PROTOCOL'} <BR>\n";
print " <B>SERVER_SOFTWARE </B>=$ENV{'SERVER_SOFTWARE'} <BR>\n";
print " <B>HTTP_ACCEPT </B>=$ENV{'HTTP_ACCEPT'} <BR>\n";
print " <B>HTTP_USER_AGENT </B>=$ENV{'HTTP_USER_AGENT'} <BR>\n";
print " <B>HTTP_HOST=$ENV{'HTTP_HOST'} <BR>\n";
print " <HR>\n";

Эта часть прграммы выводит основные переменные окружения.

print "Все переменные среды: <BR>\n"
foreach $env_var (keys %ENV) {
print " <I>$env_var=$ENV{$env_var} </I> <BR>\n";
}
А этот цикл проходит весь хэш и выводит значения всех параметров.

print " </BODY> </HTML>\n";

И, наконец, заканчиваем документ.

Как это работает можно посмотреть здесь.