Perl -- язык программирования, название которого у многих ассоциируется
со словами CGI-программирование. На самом деле это не так. Perl
действительно очень прост в обращении, что делает его применимым к
CGI-программированию, но он не единственный язык подходящий для CGI, хотя
и является самым удобным и распространенным языком программирования CGI.
В этой статье я попытаюсь преподнести Вам, уважаемый читатель основы
этого языка, в конце этой статьи я расскажу о том, как пользоваться
PERL для программирования CGI. К CGI относятся такие общеизвестные
программы, как web chat, гостевые книги, онлайн-магазины, а также программы
для накрутки, показа рекламы, вытаскивании данных с чужих страниц
(обо всем этом я поговорю в статье "Накрутки", которая где-то через неделю
появится в номере)
Сразу скажу, что все операторы, кроме блоковых
(рассмотрены в конце статьи) должны
заканчиваться точкой с запятой.
Итак, вот первая программа на языке Perl, которую пишут на всех языках.
print "Привет, Пользователь!\n";
Естественно, что она печатает (print (англ.) - печатать) на стандартный
вывод строку "Привет, пользователь!", после которой переведет
курсор на новую строку. Хотя и не всегда под стандартным выводом стоит
понимать монитор, если Вы ее запустите из-под командной строки Unix (Linux, Dos, Windows),
то действительно стандартным выводом будет монитор, а если Вы запустите
ее как CGI-скрипт, то стандартным выводом станет страница, которая
создается этим скриптом (введенное понятие скрипт обозначает
программу на интерпретируемом языке, в данном случае -- Perl).
Но, есть вещи, которые выгодно отличают Perl от языков типа JavaScript.
Это возможность сохранить переменную или их множества (массивы, хеши)
в файл; так же удобно то, что исходный код к Вашей программе на Perl,
если Вы правильно настроили атрибуты
файла не получит никто, кроме администраторов системы.
Было упомянуто слово переменные, также их называют
скалярами -- простейший вид данных, которым манипулирует Perl (определение Рэндала Л. Шварца -- автора книги "Programming Perl").
Скаляры в Perl представлены двумя типами данных -- строками и числами.
Сначала рассмотрим числа.
Perl использует для хранения чисел формат данных double -- это обозначает,
что ВСЕ числа в Perl хранятся, как дробные. Так, число 12 хранится в
памяти Perl, как 12.00, чтобы записать
восьмеричное число, нужно перед числом
поставить 0 (нуль), перед шестнадцатеричным - 0x.
0377 -- восьмеричное 377, ему
соответствует десятичное 255
0xFF -- шестнадцатеричное FF, то же
десятичное 255
Строки -- так же являются переменными, но
заключенные в двойные кавычки (которые частью строки не являются), например
"Hello!" есть строка длины 6 (не включая кавычки).
Переменные в Perl начинаются со знака $, идущей за ним буквы
и знаков: все символы латинского алфавита,
цифры и знаки подчеркивания, примеры:
правильные имена: $a, $beta_312, $Alfa;
неправильные имена: $1_bom, $_34 (начинаются не с буквы).
Итак, перепишем нашу начальную
программу.
$hello="Привет, Пользователь!";
print $hello; То есть, мы сначала
присваиваем переменной $hello значение "Привет,
Пользователь!", после этого мы выводим
значение переменной $hello.
Очень интересной вещью
является интерполяция строк (вставка
значений переменных), то есть
результатом работы программы:
$a="Hello,";
$b="$a World";
print $b;
станет выведенная строка Hello,
World!.
К
файлу на диске в Perl принято обращаться по
имени файловой переменной. Соответствие
между файлом и файловой переменной (которая
еще называется дескриптором)
устанавливается операцией open, например:
open(FILE,"<test");
назначить переменной FILE (файловые
переменные пишутся без вводного символа $)
файл test, открытый для чтения (знак
меньше ("<") перед названием файла
обозначает открытие для чтения, знак больше
(">") -- для записи, два больше
(">>") для добавления). Чтобы
прочитать строку из файла, нужно
использовать операцию космического
корабля (spaceship), которая пишется для
данного случая так: <FILE>, где FILE --
файловая переменная, пример:
open(TEST1,"<test");
$a=<TEST1>;
в переменной $a будет значение
первой строки файла test и еще символ
новой строки. Чтобы убрать символ новой
строки нужно использовать команду chomp($a); где
$a -- переменная, у которой мы хотим
убрать последний символ новой строки, то
есть
open(TEST1,"<test");
$a=<TEST1>;
chomp($a);
print $a;
не забудьте, что как я уже писал в
статье "Введение в UNIX", CGI-скрипты
будут выполняться пользователем nobody,
так что файл test должен иметь атрибуты,
открытого для чтения для пользователя nobody.
Операция закрытия файла пишется как close(FILE);. И, наконец, последняя, но
самая сложная в нашей статье программа.
$flag=0;
print "А как вас звали в прошлой жизни? ";
$name=<STDIN>;
chomp($name);
print "Здравствуйте, $name!\n";
open(FILE,"<names");
while ($_=<FILE>) {
chomp($_);
if ($_ eq $name) {
$flag=1;
};
};
close(FILE);
if ($flag eq 1) {
print "А я Вас помню\n";
} else {
open(FILE,">>names");
print FILE "$name\n";
close(FILE);
};
но, как говорится, у страха глаза
велики. Разберемся по порядку. $flag=0; -- знак
присваивания(=) -- присвоить переменной слева значение того, что
стоит справа. Значит присвоить переменной $flag
значение 0. Пока большего знать не надо.
Далее: написать строку; а вот дальше знак
космического корабля и непонятная файловая
переменная STDIN, на самом деле
обозначающая стандартный ввод. То есть
просто произойдет чтение с клавиатуры (также как и print,
при условии запуска из командной строки
UNIX). Далее open открывает файл
names для чтения -- помните
знак ("<")? Дальше идет
ключевое слово while, котороеозначает -- делать пока условие не нулевое. Условие --
это то, что записано в скобочках после слова while.
Неискушенный программист подумает что условие
это то, что переменная $_ равна ли значению
выражения <FILE>
(то есть очередной строки файла
соответствующему дескриптору FILE), а человек, программировавший на
C/C++ сразу поймет, где тут собака зарыта.
На самом деле,
это даже не совсем условие -- это оператор
присваивания, да-да, ни что иное, как этот
самый оператор(=). А операторы сравнения мы
рассмотрим позднее. Теперь попробуем понять, что
же представляет из себя это условие.
Разберем просто оператор ($_=<STDIN>.
Присвоить значение переменной по-умолчанию (переменная $_
называется переменной по-умолчанию) значение
ввода (помните операцию космический корабль (<>))
с потока данных -- в данном случае этим потоком
является файл, описанный дескриптором FILE -- то
есть файл с названием names (смотри выше --
операция open). А с помощью космического корабля
вы читаете каждый раз строку до символа (\n) новой
строки. Значит прочитать очередную строку из файла
names и занести ее в переменную $_. Далее, напомню,
что прочитанная строка будет заканчиваться символом
\n, значит даже пустая строка прочитанная из файла
не будет нулевой длины.
Это условие натолкнуло меня на мысль: А если в
файле 5 строчек (пустых), последняя из которых не
заканчивается знаком новой строки - прочитает ли ее
Perl? Я написал программу и проверил ее. И
действительно, как я и думал, программа насчитала
только 4 строки. А, т.к. последняя строка была пустой
и в конце не было символа \n, то Perl действительно
счел ее пустой, и не посчитал нужным выполнять
условие while далее.
Значит while будет назначать переменной $_
очередную строку из файла (включая символ \n), пока
та не станет равной "" то есть пустой строке (в
данном случае кавычки показаны как ограничители
строки. Техническое отступление: мы говорим с вами о
символе \n, и меня натолкнуло на мысль, что
уважаемые читатели, по моей вине могу подумать, что
и в памяти строки хранятся как
строка\n, хотя на самом деле
это не так, позвольте проиллюстрировать.
Строка Разработчик - лучший журнал\n будет
храниться в памяти как
|208| 224| 231| 240| 224| 225| 238| 242| 247| ...| 237| 224| 235| 10|,
где все эти цифры -- ASCII-коды соответствующих им
символов, а 10 -- ASCII код знака смены строки.
Таким образом знак новой строки, записывающийся
как \n, на самом деле только 1 символ, но ввиду того,
что он непечатный символ -- его заменили на 2
символа '\' и 'n'. Но, вернемся к программе -- мы все еще пытаемся
понять строку while ($_=<FILE>) {. То есть читать
строку в $_ из файла с дескриптором FILE до тех пор
пока строка не станет нулевой (пустой). А строка тогда станет
нулевой, когда программа не сможет прочитать
ничего из файла -- конец файла или пока не прочитает строку, которая будет
пустой и не будет оканчиваться символом
новой строки \n (см. выше) . Но что же это за
издевальство -- где точка с запятой? Вместо нее здесь
стоит открывающая фигурная скобка. Что же она
обозначает? А означает она блоковую операцию,
чтобы делать в цикле while (пока условие верно) несколько
операций вы должны заключить их в фигурные
скобки.
В данном случае мы в цикле читаем имена из файла
names, удаляем \n в конце (chomp) и если(if)
это прочитанное имя
равно имени, которое пользователь ввел, то флаговая
переменная ($flag) устанавливается в 1. Дальше мы
закрываем файл (close), если флаговая переменная равна 1,
то пишем "А я Вас помню", в противном случае (else)
открываем файл names для добавления (">>") и записываем туда
очередное имя.
А если перевести это на человеческий язык, то программа будет
запоминать все имена.
К сожалению, у меня не хватило места написать о CGI - программировании,
но обещаю, что это будет статьей через пару дней, так как
следующая по плану статья - Введение в HTML.
Поздравляем, вы только что прошли crash курс по
языку perl.
|