Программы на языке Perl
Исходные файлы: Submitscore.pl, Getscores.pl
Программы Submitscore.pl и Getscores.pl, написанны на Perl. Чтобы эти программы работали на вашем сервере, понадобится загрузить эти файлы и отладить их. Если вы прежде этим не занимались, проконсультируйтесь с администратором сети или Internet-провайдером. Учтите, что не все серверы могут выполнять программы, созданные с помощью CGI. Если вы пользуетесь услугами дешевого хостинга или ваш провайдер предоставляет бесплатное Web-пространство для своих пользователей, будьте готовы к тому, что CGI-программы не будут работать на вашем сервере.
Хотя этот раздел не называется "Руководство по программированию на Perl для начинающих", ниже приведены листинги программ Submitscore.pl и Getscores.pl с краткими пояснениями, как работает каждая из их частей. Если вы незнакомы с программами, использующими стандарт CGI, обратитесь за разъяснениями к людям, сведущим в этой области.
Комментарий в языке Perl начинаются с символа #. Программа Submit-score.pl начинается с комментария, который на самом деле используется Web-сервером для определения адреса программы, интерпретирующей сценарии Perl. Нижеприведенный путь широко распространен и должен работать на вашем сервере. Если возникнут какие-либо проблемы, свяжитесь с вашим Internet-провайдером.
#!/usr/bin/perl
Первая строка текста самой программы начинается с отправки результативных данных обратно во Flash-ролик. Именно за это отвечает выражение Content-type: text /html, за которым следуют две пустые строки. Первая строка любого файла, посылаемого с Web-сервера, сообщает
браузеру (в данном случае Flash-ролику) о типе передаваемых данных. В этом примере передаваемые данные - обычный текст.
# Устанавливаем метку для текстового документа, отсылаемого
# назад браузеру.
print "Content-type: text/html\n\n";
Затем данные из Flash-ролика передаются в программу, где для их временного хранения используется переменная $get_data:
# Получаем переданные данные.
$get_data = $ENV{'QUERY_STRING'};
Когда данные пересылаются через сеть, они обычно кодируются таким образом, чтобы не допустить их некорректную передачу. Буквы не кодируются в отличие от пробелов, которые передаются как знак "+", и небуквенно-цифровых символов, передающихся как символьные последовательности, например %ОА. Чтобы раскодировать данные, необходимо дополнить программу следующими строками:
# Преобразуем закодированные символы.
$get_data =~ s/%([\dA-Fa-f][\dA-Fa-f])/pack ("С",hex($l))/eg; #get_data =~ tr/\+/ /;
Далее нужно получить текущее время, измеренное на Unix-сервере в секундах, прошедших с 01.01.1970. Эти данные вы будете использовать как то время, когда был получен результат. Лучше оперировать именно этим показателем, а не временем, которое показывает сам Flash-ролик: игроки могут находиться в разных часовых поясах, а у некоторых из них может быть неправильно установлено время на их компьютерах.
# Вносим в базу данных время, оказываемое сервером, в секундах. $server_time = time();
Следующий шаг - организация цикла, который берет последовательность символов, хранящуюся в переменной $get_data, и разделяет ее на части. Например, такая последовательность имеет вид: name=Gary&score=967. Она разделяется на два элемента: до и после символа &, а затем каждый из этих элементов подразделяется еще на два - на ключ и на значение, теперь уже благодаря символу =.
# Обрабатываем полученные данные и создаем массив.
@split_data = split("&",$get_data);
foreach $data_item (@split_data)
{
($key, $value) = split("=",$data_item)
$info{$key} = Svalue;
}
Текстовой базой данных, где хранятся лучшие результаты, служит файл Highscore.txt. Чтобы запустить этот файл, загрузите его и настройте таким образом, чтобы с помощью программ на языке Perl можно было вводить в него информацию. Для этого предназначены следующие кодовые строки:
# Определяем имя файла, который будет содержать базу данных.
$filename = "highscore.txt";
# Открываем базу данных.
open(OUTFILE, "»$filename") || exit;
После того как файл будет открыт, программа внесет в него единичные записи, содержащие набранные очки, имя игрока и время, например: 967&Gary&978887513.
# Вносим информацию в базу данных.
print OUTFILE "$info{'score'}&$info{'name'}&$server_time\n";
Программа Submitscore.pl заканчивает свою работу, закрывая текстовый файл и пересылая определенную информацию во Flash. В данном случае переменной resultText присваивается символьная строка ОК.
# Закрываем базу данных.
Close(OUTFILE);
# Подтверждаем ввод данных,
print "resultText=OK\n";
# Завершаем программу,
exit;
Программа Getscores.pl несколько сложнее, чем Submitscore.pl. В ее задачу входит просмотр базы данных, удаление устаревших записей и затем выдача списка десяти лучших результатов. Начало этой программы аналогично началу Submitscore.pl. Далее файл открывает базу данных и перебирает все ее записи с использованием переменной типа "массив" @score_text.
#!/usr/bin/perl
# Устанавливаем метку для текстового документа,
# получаемого на выходе.
print "Content-type: text/html\n\n";
# Указываем имя файла, содержащего базу данных.
$filename = "highscore.txt";
# Просматриваем записи базы данных,
open(DATABASE,$filename) || exit;
@score_text = ;
close(DATABASE);
Затем программа подсчитывает, какое время (в секундах на сервере) было ровно семь дней назад.
# Определяем время на сервере.
$server_time = time();
# Выясняем, как долго сохранять полученные результаты.
# (7 дней * 24 часа * 60 минут * 60 секунд)
$keep_time = 7*(24*60*60) ;
Теперь база данных открыта и готова для записи. Старый файл перезаписывается с учетом новых данных.
# Открываем базу данных для перезаписи.
open(DATABASE,">" . $filename) || exit;
Следующий цикл проверяет каждую запись и определяет, как давно она была внесена в базу данных. Если запись устарела, то она не переписывается в новый файл.
# Просматриваем каждую запись.
foreach $score_line (@score_text) {
# Получаем данные о набранных очках.
@score_item = split(/&/,$score_line);
# Определяем время занесения результата.
$score_time = $score_item[2];
# Если запись не устарела, переписываем ее в новый файл.
if ($score_time > ($server_time-$keep_time)) {
print DATABASE "$score_Iine";
# Закрываем базу данных. close(DATABASE);
Далее программа сортирует результаты игры. Так как в начале каждой строки базы данных содержатся набранные очки, именно по ним упорядочиваются записи, от лучшего результата игры к худшему.
# Упорядочиваем набранные очки.
@score_text = sort { $b $а } @score_text;
Следующий цикл отбирает первые десять результатов и выдает их как выходные данные. Каждый элемент строки специальным образом форматируется. Эта строка выглядит, например, следующим образом: "l.Gary 967". После номера строки ставится точка. Затем идет имя игрока: если оно содержит меньше 18 символов, оставшееся место заполняется пробелами. Далее выводятся набранные игроком очки - они выравниваются по правому краю, и если число цифр меньше девяти, то свободные места с левой стороны также заполняются пробелами.
# Определяем число результатов,
# которые программа отошлет как выходные данные.
$num_scores = 10;
$score_count = 1;
# Просматриваем первые записи и отправляем данные,
print "highScoresText=";
foreach $score_line (@score_text) {
# Прочитываем записанные данные и создаем массив.
@split_data = split("&",$score_line);
# Выводим номер строки с точкой после него.
printf("%2i. ", $score_count);
# Выводим имя игрока, выравниваем по левому краю, оставшиеся
# свободные места до 18 символов заполняем пробелами,
printf("%-18s ",$split_data[l]);
# Выводим набранные очки, выравниваем по правому краю,
# оставшееся слева место до девяти символов заполняем
# пробелами.
printf("%9i\n",$split_data[0]); $score_count++;
if ($score_count > $num_scores) { last; } }
# Выходим из программы,
exit;
Если вы прежде программировали только на Flash и никогда раньше не сталкивались с Perl, вам будет достаточно сложно писать программы на этом языке. Можете не беспокоиться по этому поводу, потому что обычно подобные проекты разрабатываются двумя программистами совместно: один из них владеет языком Flash, другой - Perl. Если возможно, постарайтесь с кем-нибудь объединиться.