Поможем написать учебную работу
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
Если у вас возникли сложности с курсовой, контрольной, дипломной, рефератом, отчетом по практике, научно-исследовательской и любой другой работой - мы готовы помочь.
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!.
На массивах пока мы заострять внимание пользователя не будем, поэтому перейдем к работе с файлами в части 2
К файлу на диске в 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.
Массивы в PERL
В статье "Введение в PERL" мы не коснулись темы массивов. Сначала рассмотрим понятие списка. Список -- это упорядоченный набор скаляров. Массив -- переменная, содержащая список. К массивам применимо понятие элемента. Каждый элемент массива содержит некое скалярное значение, независящее от других элементов. Значения в списке упорядоченные, то есть, например расположены по возрастанию от младшего к старшему. Значения элементов массива не обязательно упорядоченные. Так как в Perl нет объявления переменных как стадии, то и количество элементов массива ограничено только размером свободной памяти. Существуют также пустые массивы, которые не имеют элементов вообще. Списочные литералы. Списочный литерал -- способ представления массивов в программе. Записывается он как несколько значений скаляров через запятую, ограниченных круглыми скобками. Значения этих скаляров и есть элементы списка. Как Вы видите, совсем не обязательно, чтобы элементы массива были одинакового типа. На самом деле в Perl понятие типа не совсем применимо, хотя и имеет место. Вы, например, можете сделать переменную $temp, присвоить ей значение 3 ($temp="3"), затем прибавить конкатенацией (соединением строк) к ней цифру 9($temp=$temp."9") и затем разделить на 3($temp=$temp/13) и получить 13. Элементы массива не обязательно статичны, они могут вычисляться во время определения массива: Пустой массив задается так: В Perl также есть операция конструктора списка, которая создает массив элементов от левого значения до правого с шагом 1, например: |
Имена массивов задаются так же, как и просто скалярных переменных за одним исключением- символ @, буква, и нуль или больше символов, пример:
@test, @b1, @Te_23
Списочный литерал может быть использован для операции print, например:
print("Число 12345 можно записать так: ", 1..5, "\n"); # Будет выведено Число 12345 можно записать так: 12345 и символ новой строки.
Начнем с начала -- с присваивания:
@test=(1,2,3); # Присвоить массиву test значение из трех элементов
@test2=@test1; # Присвоить массиву @test2 все значения массива @test (скопировать)
@test3=5; # Массив из одного элемента
Обращение к элементам массива происходит так:
@test1=(1,2,3);
print $test[0]; # Напечатать первый элемент, так как в Perl нумерация элементов происходит с 0.
С элементами можно делать те же операции, что и со скалярами.
$test[0]=$test[0]+1; # Прибавить 1 к первому элементу массива @test.
Так же имеет смысл обращение к элементам массива в списочном контексте.
@test[1,2]=@test[2,1]; # Поменять местами элементы второй с третьим
@test=@test1[0,1]; Назначить массиву @test значения первых двух элементов массива @test1
Функции push и pop
Эти операции используются для добавления и вытаскивания элементов из списка. PUSH заталкивает значения в конец массива, POP вытаскивает последнее значение массива, удаляя его:
@test=(); # @test - пустой массив
push(@test,1); # @test теперь содержит (1)
$test1=pop(@test); # @test теперь снова пустой, а $test1 содержит 1.
Функция push может заталкивать и несколько значений и даже массивы:
push(@test,@test1); # Добавить в конец @test все значения массива @test1
Есть 2 аналогичные функции - shift и unshift, но они соответственно вытаскивают и заталкивают значения, но в начале массива:
unshift(@test,1); # Добавить 1 в начало массива @test
$a=shift(@test); # Взять первое значение массива @test поместить в $a, удалить первое значение массива и сдвинуть все остальные значения к началу.
Функции reverse и sort.
Эти функции предназначены соответственно для преобразования массивов. Reverse переворачивает массив, а sort -- сортирует массив:
@test=(3,1,2,1); # @test содержит 3, 1, 2 и 1
@test=reverse(@test); # @test содержит 1, 2, 1 и 3
@test=sort(@test); # @test содержит 1, 1, 2 и 3