Российский государственный гуманитарный университет
Опубликован: 15.08.2003 | Доступ: свободный | Студентов: 6518 / 1489 | Оценка: 3.91 / 3.79 | Длительность: 06:55:00
Лекция 3:

Введение в программирование на Perl

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >

Аргументы командной строки

Когда пользователь работает с операционной средой в режиме удаленного алфавитно-цифрового монитора, он пользуется услугами оболочки (shell). Команды в операционной среде в этом случае вводятся в командной строке, и за каждой из команд может тянуться шлейф аргументов. Эти аргументы и называются аргументами командной строки.

CGI-скрипт вызывается не из оболочки, а загружается HTTP-сервером. Если необходимо воспользоваться аргументами командной строки, то сервер должен породить данную командную строку тоже. В CGI это делается только для запросов ISINDEX. В таком случае скрипт вызывается через URI типа:

http://my.intuit.ru/directory/
     script?arg1+arg2+arg3

В этой записи arg1+arg2+arg3 — аргументы командной строки скрипта, т.е. данный URI равнозначен вводу в командной строке команды:

host>script arg1 arg2 arg3

Для приема этих аргументов достаточно воспользоваться скриптом типа:

#!/usr/local/bin/perl
print "Content-type: text/plain\n\n";
foreach $arg (@ARGV)
{
 print "$arg\n";
}

В данном случае мы просто их распечатаем. Программа будет выбирать по одному аргументу из системного массива аргументов командной строки @ARGV и помещать их в переменную $arg, а затем печатать.

В принципе, аргументы попадают и в переменную окружения   QUERY_STRING, т.к. при запросе типа ISINDEX применяется метод GET. Но тогда придется данную переменную разбирать. Аргументы командной строки уже сделали эту работу за программиста.

Стандартный ввод

Поток стандартного ввода обычно ассоциируется с клавиатурой терминала. Поток стандартного ввода — это источник входных данных по умолчанию. В С, например, поток стандартного ввода ассоциируется с файлом STDIN. В Perl применяется то же самое имя.

Для построчного чтения входного потока в Perl применяется пара символов "<>". Простая программа, читающая входной поток, может выглядеть следующим образом:

#!/usr/local/bin/perl
while(< >)
{
 print $_;
}

В данном примере две скобки подряд определяют чтение из потока стандартного ввода. Магическая последовательность $_ обозначает системную переменную, в которую по умолчанию помещается каждая считанная из стандартного ввода строка. При этом символы конца строки сохраняются.

Согласно спецификации CGI, скрипт получает данные через стандартный ввод в том случае, если в качестве метода доступа в форме будет указан POST. Приведенный выше пример работы со стандартным потоком ввода не может быть применен для обработки такого запроса. Дело в том, что сервер не закрывает поток ввода и, следовательно, не передает EOF (End of file, конец файла). Цикл while в этом случае будет бесконечным.

Скрипт сам определяет точное количество байтов, которые он должен прочитать из стандартного ввода. Это можно сделать, прочитав значение переменной CONTENT_LENGTH ( perlm1.htm ):

#!/usr/local/bin/perl
print "Content-type: text/plain\n\n";
print "CONTENT_LENGTH=$ENV{CONTENT_LENGTH}";

Когда число байтов для чтения из потока стандартного ввода определено, эти байты нужно считать. Воспользуемся функцией read:

#!/usr/local/bin/perl
print "Content-type: text/plain\n\n";
print "CONTENT_LENGTH=$ENV{CONTENT_LENGTH}\n";
read STDIN,$query,$ENV{CONTENT_LENGTH};
print "Query:$query.";

После выполнения этих несложных операций в переменную $query будет занесено содержание стандартного ввода скрипта, с которым потом можно будет разбираться

Типы данных и переменные

В Perl существует довольно своеобразный набор типов данных: скаляры, одномерные массивы (массивы), ассоциативные массивы (хешированные таблицы или хеши), глобальные символы, ссылки. Обычно первых трех для CGI-программирования вполне хватает. Ссылки применяют в совокупности со стандартными библиотеками и вместо функции отложенного выполнения eval. Глобальные символы нужны при работе с файлами или для межпроцессного обмена данными при открытии каналов (потоков данных) через дескрипторы.

Скаляры

Скаляры — это все, что нельзя записать в виде массива или структуры. Числа всех типов и строки символов относятся к скалярному типу. Скаляр обозначается символом "$" перед именем. Примеры скаляров:

$a = 1;
$b = 2.5;
$str = "это строка символов";
Одномерные массивы

Массивы — это множество элементов, причем все элементы могут быть разнородными. В Perl нет понятия массива чисел или массива строк. Массив не может быть многомерным. Можно реализовать массив массивов и, таким образом, сделать массив двумерным. Массив обозначается символом "@" перед именем. Примеры массивов:

@a = (1,2,3);
@b = (4,5,6,2.5,"test");
@c = (@a,@b);
@in = 
$q = $c[3]; # 4

Индексирование элементов массива начинается с цифры 0. Поэтому в нашем примере четвертый элемент массива с будет индексироваться как $c[3].

Ассоциативные массивы

Ассоциативные массивы — это двухколоночная таблица. Первая колонка — ключ, а вторая колонка — связанное с ним значение. Ассоциативные массивы называют еще хешированными таблицами или просто хешами. Дело в том, что значение можно извлечь из таблицы прямо, указав ключ. При этом используется алгоритм хеширования по ключу.

Для краткости будем называть ассоциативный массив хешем. Обозначается переменная типа хеш символом "%" перед именем. Примеры хешей и обращений к их элементам:

%a = ("test",1,"test2",2);
$c = $a{test}; # $c=1

В первом случае хеш инициируется как обычный массив. Во втором примере мы выбираем значение определенным ключом " test ". Результат этой операции, скаляр, помещается в переменную $c.

Указатели

Указатели — это аналог адресных указателей в С. Указатель обозначается символом "\" перед именем переменной:

$a = 1;
$p = \$a;
@b = (1,2,3);
$p = \@b;
$p = \%c;

Обращения к значениям, выбранным указателем, являются аналогом применения функции eval (отложенное исполнение):

%a = ("test",1,"test2",2);
$p = \%a;
$c = $$p{"test"};

где вместо " а " используется $p.

Глобальные символы

Последнее, что мы рассмотрим — это дескрипторы потоков данных. Дескриптор потока указывает на структуру, которая описывает механизм обмена данными, например, с файлом. Применяются такие дескрипторы в функциях чтения и записи данных и в межпроцессном обмене:

open IN;
read IN,$p,500;
close IN;

В данном случае IN — дескриптор файла.

< Лекция 2 || Лекция 3: 1234 || Лекция 4 >