Рассмотрим базовые принципы Perl, популярного языка для написания CGI скриптов - программ, которые взаимодействуют с веб сервером для создания большей динамичности веб страниц.
Для многих задач разработчики используют более современные альтернативы, такие как PHP - которые включают некоторые функции, взятые из Perl - но Perl все равно лучше для освоения базовых навыков создания CGI скриптов.
Если посмотреть, то вы обнаружите что на каждой Linux системе установлен Perl, и кроме того вы можете скачать Perl для Windows - с сайта activestate.com.
Базовые принципы
Perl - язык-интерпретатор (как PHP), и он не "строго типизированный", что означает, что вам не обязательно объявлять переменную, перед тем как её использовать, и указывать какого она типа. Вы можете написать что-то вроде этого:
$a = ‘hello world’ ; $b = 12 ; print $a ;
Как вы видите, каждое выражение заканчивается точкой с запятой, строка заключается в апострофы.
Одна из первых вещей, которые необходимо запомнить, как и в некоторых других языках, это то, что важен тип кавычек; если вы используете одиночные кавычки (апострофы), то выражение внутри трактуется как строка текста; если вы используете двойные кавычки, то в выражении можно использовать специальные символы и переменные. Например, напишем следующий код:
print ‘$a\n’ ;
В результате будет выведена строка "$a\n’"
Если использовать код
print “$a\n” ;
то с новой строки будет выведена сообщение "hello world"
Всегда проверяйте правильность строк внутри двойных кавычек.
Как запустить скрипт? Если вы хотите провести простой тест - используйте Perl интерактивно: откройте командное окно и наберите perl (в Windows, вам возможно придется добавить путь к файлу perl.exe).
Теперь набирайте строчки скрипта. В конце добавьте пустую строку и затем нажмите Ctrl & D. Обычно нужно сделать что-нибудь более сложное, для этого напишите свой скрипт в текстовый файл и сохраните его с расширением .pl. Затем запустите его, выполнив команду
perl scriptname.pl
В системе Linux вы можете первой строкой написать #!/usr/bin/perl и использовать команду chmod для того чтобы сделать файл скрипт выполняемым. Тогда для запуска скрипта вам нужно будет только написать его имя, например ./scriptname.pl. Обычно строки, начинающиеся со знака # являются комментарием, но первая строка в *nix указывает системе интерпретатор скрипта.
Блоки и циклы
Программирование, как правило, включает блоки данных или команд, которые используются внутри циклов, и Perl не является исключением. Фактически он был спроектирован для работы с текстовыми файлами, то есть читает информацию находящуюся внутри них или со стандартного ввода (набор на клавиатуре) или из списка файлов в командной строке. Вот простой пример скрипта:
#!/usr/bin/perl # simple test script to read a file and print it # while (<>) { print $_ ; }
Сохраните файл как test.pl и запустите его используя следующую команду:
perl test.pl test.pl
Второй test.pl можно заменить именем любого другого текстового файла. Взглянув на скрипт, можно увидеть блоки команд в цикле, заключенные в фигурные скобки.
Для задания условий в цикл while используются значки <>. Специальное указание "<>" означает что используется стандартный ввод, а специальная переменная "$_" означает текущую строку ввода. Таким образом, скрипт читает строку со стандартного ввода и выводит её. Если вы просто наберете perl test.pl, он будет ожидать пока вы наберете какую-нибудь строку и затем выведет её, и так будет продолжаться пока вы не нажмете Ctrl & D, что будет означать конец скрипта.
Вам так же надо использовать скобки в выражениях if - для условий используются обычные скобки, а для блока команд фигурные. В следующем куске кода мы используем еще одну часто используемую в Perl вещь - сравнение.
Оператор "=~" сравнивает совпадают ли переменные, а оператор "!~" проверяет несовпадение. Добавть в конец скрипта следующий строки и запустите его командой perl test.pl test.pl:
while(<>) { if ( $_ =~ /Fred/ ) { print “Fred is here, line 4 $line: $_\n” ; } $line++ ; }
Результатом будут две строки кода и перед каждой примерно такое сообщение: "Fred is here, line 7."
Практическое приложение
Теперь нас есть простой скрипт, который ищет в файле слово "Fred", но для чего мы можем его использовать?
Например, его легко встроить в какой-нибудь полезный CGI скрипт, скажем, для поиска строки в таблице данных.
Очень часто, на простых вебсайтах работа с базами данных уже реализована. Но если у вас уже есть данные в формате Excel или похожем, вы можете сохранить их формате CSV (Comma Separate Values - данные разделенные запятой), или другом текстовом формате.
Затем вы загружаете их на ваш веб-сайт, используете простой Perl скрипт для извлечения строк в зависимости от запроса пользователя - для этого мы используем наш пример.
Давайте используем некоторые данные: составим простую таблицу с контактными номерами телефонов. Она будет содержать имя человека, и два номера.
Сохраним файл в формате CSV, и загрузим его на сервер в ту же директорию, в которой будет наш скрипт. Мы создадим скрипт для извлечения строки, содержащей данные человека, которого необходимо найти. Скрипт в конце содержит полный код.
Сначала мы посылаем заголовок, чтобы сказать веб браузеру, что передается простой текст; как и в других заголовках, это необходимо сделать c новой строки, и затем добавить пустую строку, показывающую конец заголовка и начало содержимого веб страницы.
Затем команда open читает файл, расположенный в той же директории, что и скрипт, CSV файл, который мы создали в Excel; в качестве идентификатора файла используется имя "CONTACTS". Его мы будем использовать в цикле while для чтения файла. Поскольку все данные разделены запятой, мы можем записать их в различные переменные.
Первая команда next if нужна для пропуска следующей итерации цикла; мы убеждаемся, что не выведем строку, содержащую заголовок, который Excel добавляет в CSV файл. Вторая команда используется для нескольких вещей; здесь есть сравнение, с которым мы знакомились раньше, но в конце используется маленькая буква i, которая заставляет Perl игнорировать блок.
Вторая вещь, которую мы добавили - это ассоциативный массив; Это простой массив, состоящий из имен каждого элемента.
Они выделяются фигурными скобками, а специальный массив $ENV содержит переменные окружения, которые содержат информацию о веб сервере, как части CGI системы. Переменная, которая нас интересует - QUERY_STRING, которая содержит часть адреса, стоящую после знака вопроса.
Эта часть проверяется на совпадение и пропускаются все строки, кроме совпадающих, скрипт завершает работу, выдав все контакты, которые найдет.
Таким образом, если вы сохранили скрипт на сервере под именем contacts.pl - кроме этого его возможно придется сделать исполняемым - и затем загружаете страницу http://[название_вашего_сервера]/contacts.pl, вы увидите список, состоящий из всех записей таблицы. Но если вы используете адрес вроде такого: "contacts.pl?smith", вы увидите только строку данных, в которой есть это имя.
Теперь все, что вам нужно делать - это время от времени обновлять данные. В будущем, вы можете изменить тип данных на text/html и использовать HTML тэги в командах вывода. Или вы можете создавать временные файлы и затем использовать команды Perl для поиска и замены, и записать данные в эти временные файлы для дальнейшего использования.
Чтение списка контактов из CSV файла с помощью Perl
#!/usr/bin/perl # # Emergency contacts script for PCW print “Content-type: text/plain\n\n” ; open( CONTACT, ‘EmergencyContacts.csv’) ; while(<CONTACT>) { ( $name, $home, $mobile) = split(‘,’) ; next if $name eq ‘Name’ ; next if $name !~ /$ENV{‘QUERY_STRING’}/i ; print “Contact details for $name: tel $home, mobile: $mobile\n” ;}
Svolotch 2007-01-30 09:20:32 (#)
а закрывать файл не нужно?