Пятница
20.09.2024
13:30


Форма входа

Приветствую Вас Новичок | RSS
Компьютерные технологии
Главная Каталог статей Регистрация Вход
Главная » Статьи » Мои статьи

Perl

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.




Категория: Мои статьи | Добавил: qtex-program (01.02.2009) | Автор: qtex-program E
Просмотров: 1300 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Меню сайта

Категории раздела
Мои статьи [15]
Хакинг [19]
Хакеры и программисты
BIOS [13]
Железо [9]
Системное администрирование [15]

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Поиск

  • Друзья сайта

    Copyright MyCorp © 2024