Статьи

Программирование на Perl 101

1.) Справочная информация

Если у вас есть веб-сайт, вы наверняка слышали о Perl или CGI. Независимо от того, слышали ли вы об этом, установили несколько сценариев самостоятельно или взглянули на код и побледнели, этот учебник для вас.

Perl — это язык программирования. Многие люди думают, что CGI — это язык, как в «Я собираюсь изучать CGI», но это ошибочно. Думайте о CGI как о методе, в котором вы используете Perl. Вы можете писать CGI-скрипты, используя другие языки программирования, но Perl является наиболее распространенным из-за его относительной простоты и мощи.

Несмотря на то, что более эффективные языки программирования начинают отнимать популярность Perl, программирование на Perl остается очень популярным, и изучение его не является пустой тратой времени. Например, PHP во многих отношениях похож на Perl. Используемый синтаксис схож, и многие из основ примерно одинаковы. Если вы знаете Perl, у вас есть огромное преимущество в изучении PHP, а также нескольких других языков.

Хотя Perl может быть менее эффективен, чем другие языки программирования, такие как PHP или ASP, по-прежнему существует бесконечно больше свободно распространяемых и условно-бесплатных скриптов, написанных на Perl, чем на любом другом языке. Другими словами, Perl не уйдет в ближайшее время.

2.) Несколько маленьких правил

Теперь, когда у вас есть небольшой опыт работы с Perl, давайте перейдем к некоторым основным командам.

Как и любой язык программирования, в Perl есть правила. Вам нужно будет использовать определенные символы в определенных местах, чтобы что-то сказать сценарию. Одним из самых основных правил в Perl является то, что каждая строка должна заканчиваться точкой с запятой: » ; Как и в каждом правиле, есть несколько исключений, которые мы рассмотрим позже, но сейчас просто поймите, что почти каждая строка кода на Perl, которую вы пишете, заканчивается точкой с запятой. Точка с запятой, если вам интересно, сообщает Perl, что она достигла конца команды.

Давайте напишем быстрый сценарий, чтобы познакомить вас с некоторыми основами.

В любом скрипте на основе Perl строка, подобная этой, идет в самом верху:

#!/usr/local/bin/perl

Эта строка получила прозвище «шебанг», и это еще одно требование языка Perl. Строка shebang указывает браузеру путь к интерпретатору Perl на сервере вашего веб-хоста. Думайте об этой строке как о способе сказать вашему браузеру: «Здесь вы можете найти переводчик, чтобы превратить мой код в функциональный скрипт».

Практически на каждом веб-хосте установлен Perl, хотя он не всегда находится в указанном выше месте. Если приведенная выше строка не работает, обратитесь к системному администратору и попросите указать путь к Perl.

Обратите внимание, что вам нужно будет указывать на интерпретатор Perl в каждом файле, который вы пишете. (Примечание: файлы, оканчивающиеся на .cgi, .pl и .perl, могут рассматриваться как файлы Perl.)

В этом руководстве предполагается, что вы обладаете базовыми знаниями в области HTML и полей форм. Если вы этого не сделаете, зайдите на http://www.HtmlGoodies.com и прочитайте некоторые учебники, предлагаемые там.

Давайте создадим наш первый скрипт!

3.) Начиная с

Сценарий, который мы собираемся создать, будет принимать информацию, которую ваш пользователь отправляет в стандартной форме обратной связи, а затем загружать страницу, показывающую, что он только что ввел. Не очень полезный, но отличный пример для начала.

В этом примере мы попросим кого-нибудь ввести свое имя, город и любимую еду (в конце концов, это основная жизненная информация для всех нас, верно?).

Сначала мы создаем HTML-страницу с формой:

<html>
<head>
<title>Submit Your Information</title>
</head>

<Тело>

<h1> Отправьте вашу информацию </ h1>
<Р>
<form action = «display.cgi» method = «post»>
Имя: <input type = «text» size = «30» name = «first»> <br>
Город: <input type = «text» size = «30» name = «city»> <br>
Любимая еда: <input type = «text» size = «30» name = «food»> <br>
<P> <input type = «submit» name = «submit» value = «Submit!»>
<тип ввода = имя сброса = значение сброса = «сброс»>
</ Форма>

</ Body>
</ Html>

Вы видите имена этих полей формы? Это идентифицирующие значения, назначенные каждому полю формы, в которое пользователь будет вводить свою информацию. В данном случае это «первый», «городской» и «еда». Представьте имена, заданные для полей формы, как контейнеры, в которых будут храниться данные, введенные пользователем.

Это работает так, что когда пользователь вводит свое имя в соответствующее поле формы, тег имени «присоединяется» к введенным данным, чтобы идентифицировать его для дальнейшего использования. Если пользователь вводит слово «Marvin» в поле «first», слову «Marvin» будет присвоен тег «first». Как вы скоро увидите, мы можем использовать Perl для отображения любого текста, которому был присвоен «первый» тег. Начинаешь иметь какой-то смысл?

Теперь, как вы заметите, у нас установлено действие формы «display.cgi». Эта строка в форме говорит нам, что эта информация (с прикрепленными тегами имен, конечно) будет отправлена ​​в определенный файл. В этом случае display.cgi. Поскольку display.cgi еще не существует, давайте создадим его!

4.) Display.cgi

Теперь, когда мы получили форму (вызывайте файл как хотите, просто убедитесь, что он имеет расширение .html или .htm), мы перейдем к созданию сценария Perl для работы с данными. То, как все это будет работать, таково:

1. Пользователь будет просматривать форму и заполнять данные

2. Каждому полю в форме и введенным данным будет присвоено имя

3. Введенные данные вместе с именем поля формы будут отправлены на display.cgi для обработки

Давайте создадим display.cgi!

Во-первых, линия Шебанга:

#!/usr/local/bin/perl

Затем вставьте это:

require "subparseform.lib";
&Parse_Form;

Subparseform.lib — широко используемый файл, который поможет нам в создании этого скрипта. Выполните поиск в Интернете, и вы сможете найти его. Если поиск не удался, свяжитесь со мной, и я помогу вам: mailto: [email protected].

Теперь запомните: мы хотим, чтобы этот скрипт брал информацию из формы и отображал ее пользователю таким образом, чтобы сказать: «Это информация, которую вы ввели». Для этого нам нужно сказать скрипту «захватить» информацию формы. Но как? Мы просто должны сопоставить эти теги!

Введите это следующее:

$first = $formdata{'first};
$city = $formdata{'city'};
$food = $formdata{'food'};

Выглядит знакомо?

Обратите внимание на несколько вещей: во-первых, «;» знак находится в конце каждой строки, как и должно быть. Во-вторых, имена тегов: они точно совпадают с тегами в информации формы.

Обратите внимание на знак равенства («=»). Это говорит сценарию назначать данные, введенные в форму, переменной или контейнеру, которые мы можем использовать внутри сценария Perl. Первая строка гласит: «сделать $ first равным информации, введенной в поле формы, с именем« first »».

Как вы, наверное, заметили, во-первых, перед городом и едой стоит знак доллара. Perl требует, чтобы все переменные или контейнеры, используемые в скрипте, начинались со знака $.

Эта первая строка, как я уже говорил, сообщает браузеру, что любое поле формы, имеющее имя «first» в HTML-файле, теперь имеет имя «$ first».

Это позволяет нам использовать переменную $ first в другом месте Perl. Что произойдет, так это то, что $ first будет заменено тем, что пользователь ввел в поле «first» в форме обратной связи!

Начинаешь видеть, куда это идет?

Теперь скопируйте и вставьте это в файл display.cgi:

print "Content-type: text/htmlnn";
print "Thank you, here is the information you entered:<br>";
print "<ul><li>$first</li><li>$city</li><li>$food</li></ul>";

Эта первая строка сообщает сценарию, что вы будете использовать HTML в одном или нескольких выражениях «print». Теперь, когда информации из формы были назначены новые переменные, начинающиеся со знака $, все, что нам нужно сделать, это ввести эти имена переменных, и скрипт отобразит введенные пользователем данные.

Выражение print, которое вы видите выше, просто говорит Perl выложить HTML-код в браузер после его анализа. Вот что Perl «думает», читая три строки выше:

Первая строка: Хмм… мы будем работать с операторами HTML в одном или нескольких из следующих операторов печати.

Строка вторая: хорошо, это просто. Я просто выложу код между кавычками обратно в браузер.

Строка третья: эта строка содержит три переменные с именами $ first, $ city и $ food, которые мне нужно найти и заменить перед отправкой этой строки кода в браузер. Я возьму значение $ first из поля формы с именем «first» в только что отправленной форме, затем сделаю то же самое для $ city и $ food. Теперь, когда я знаю, что обозначают $ first, $ city и $ food, я могу отправить эту строку кода в браузер с выполненными заменами.

Вот весь файл display.cgi:

#!/usr/local/bin/perl

требуют «subparseform.lib»;
& Parse_Form;

$ name = $ formdata {‘name’};
$ city = $ formdata {‘city’};
$ food = $ formdata {‘food’};

напечатать «Content-type: text / htmlnn»;
print «Спасибо, вот информация, которую вы ввели: <br>»;
print «- Имя: $ first <br> — Город: $ city <br>»;
print «- Любимая еда: $ food»;

Предположим, пользователь ввел имя «Джон», город «Нью-Йорк», а любимую еду — «Пицца». Вот что Джон увидел бы перед собой после заполнения формы:

Спасибо, вот информация, которую вы ввели:
— Имя: Джон
— Город: Нью-Йорк
— Любимая еда: пицца

Теперь у вас должно быть общее представление о некоторых правилах Perl и о том, как может быть полезен шлепок, идентифицирующий «теги» данных. Как вы узнаете позже, вы можете указать Perl отправлять электронные письма, используя эти же переменные (теги). Представьте, что кто-то вводит свой адрес электронной почты и имя, и персонализированное электронное письмо со своим именем в строке темы!

Во второй части мы попытаемся вникнуть в ваши законы синтаксиса, изучить команды «if», «elsif» и «else» и даже изучить использование sendmail для отправки электронных писем с подтверждением / благодарностью!

Добро пожаловать во вторую часть этого учебника по Perl. В первой части вам было показано, как Perl-скрипт может получать информацию, отправленную через HTML, и отображать результаты обратно тому, кто отправляет форму, используя переменные. Переменные являются ядром языка Perl, поэтому сегодня мы узнаем о них немного больше.

1) Test.html

Создайте еще одну HTML-страницу и назовите ее «test.html». Поместите следующий код на страницу:
<html>
<head>
<title>Test.html</title>
</head>

<Тело>
<form action = «http://www.yourdomain.com/cgi-bin/test.cgi» method = «post»>
<input type = «hidden» name = «action» value = «1»>
<input type = «submit» value = «Страница 1»>
</ Форма>
<br> <ч> <br>
<form action = «test.cgi» method = «post»>
<input type = «hidden» name = «action» value = «2»>
<input type = «submit» value = «Страница 2»>
</ Форма>
<br> <ч> <br>
<form action = «test.cgi» method = «post»>
<input type = «hidden» name = «action» value = «3»>
<input type = «submit» value = «Страница 3»>
</ Форма>
</ Body>
</ Html>

Не забудьте заменить URL-адрес действия формы на путь к файлу test.cgi.

Обратите внимание на формы … они имеют только кнопку отправки и «скрытое» поле формы. Это поле формы очевидно невидимо для посетителя, однако оно все еще может содержать переменную. Если мы нажмем первую кнопку (помеченную «Страница 1»), она хорошо передаст данные в файл test.cgi. Какие данные вы спрашиваете? Да, данные, которые говорят, что поле «action» имеет значение «2», конечно! Используя эти значения, мы можем указать сценарию определить, какая кнопка была нажата, и отобразить соответствующий текст и / или HTML.

Очевидно, что следующим шагом будет создание файла test.cgi… давайте сделаем это сейчас.

2) Test.cgi

Создайте текстовый файл и сохраните его как «test.cgi»… как обычно, вам потребуется файл subparseform.lib, загруженный в тот же каталог, что и test.cgi. Как и раньше, если вы не можете найти это с помощью веб-поиска, напишите мне ([email protected]), и я отправлю его вам в качестве вложения.

На вещи; введите это в test.cgi:
#!/usr/local/bin/perl
require "subparseform.lib";
&Parse_Form;
$action = $formdata{'action'};

Как видите, сначала у нас есть стандартная линия Шебанга. Во-вторых, у нас есть команда, которая проверяет, что subparseform.lib находится в правильном каталоге. В-третьих, у нас есть подпрограмма (пока не беспокойтесь об этом слове), которая вызывается, чтобы помочь нам обработать данные, отправляемые из test.html, и в-четвертых, у нас есть строка, которая принимает значение поля действия из test.html и присваивает ему переменную «$ action».

Далее введите это:

 print "Content-type: text/htmlnn";

Это говорит сценарию о том, что мы можем использовать некоторый HTML в наших командах печати … даже если вы не используете HTML, я рекомендую использовать эту строку в ваших сценариях всегда, чтобы избежать потенциальных проблем.

Теперь введите это:

if ($action eq "1") {
print "You must have clicked the first button!";
}

Это не совсем простой английский, но гораздо проще понять многие другие вещи из этого урока. Вышеуказанное называется командой if. Видите первую строку там? В переводе на английский это будет звучать так: «Если переменная $ action равна 1.» Обратите внимание на открывающую скобку сразу после этого оператора и закрывающую скобку после оператора print. Вы видите, куда это идет?

Оператор «if» в основном говорит сценарию, что если $ action равен «1», то обрабатывать код внутри этих двух скобок. Если кто-то нажмет, скажем, вторую кнопку, то переменная $ action будет иметь значение, отличное от 1, и код внутри этих скобок не будет обработан — сценарий просто пропустит ее.

Теперь предположим, что вы хотите отобразить некоторый текст на случай, если кто-то нажмет вторую кнопку. Может ли Perl справиться с этим? Черт возьми да … введите это:

elsif ($action eq "2") {
print "Well, odds are you clicked the second button...";
}

Приведенный выше код довольно понятен. Это как утверждение «если» во всех отношениях, за исключением того, что перед словом «если» стоит «els». Это, превратившись в предложение, будет читать «иначе, если». Это говорит сценарию, что если предыдущий оператор «if» является ложным (т.е., если условие равенства не выполняется), посмотрите на этот оператор, и если он равен «true» (если переменная $ action равна 2 ), затем обработайте код внутри.

Создание оператора для отображения текста, если пользователь нажимает третью кнопку, почти такой же:

elsif ($action eq "3") {
print "Who woulda thought? You pressed the third button!";
}

Пока это все хорошо, но нам нужно что-то вроде отказоустойчивости. Пока с использованием кода, сообщение будет отображаться независимо от того, какая из трех кнопок нажата. Но что, если что-то еще случится? Например: что, если переменная $ action (не говоря уже о причине) будет отличаться от 1, 2 или 3?
Не бойтесь, для этого есть заявление:

else {
print "Sorry, there is no page available for that number.";
}

Ага! Мы можем использовать оператор if, два оператора else-if, а теперь оператор else. Оператор «else» является последним средством … если выполнено NONE из первых трех условий, оператор else обрабатывается. В основном говорится: «Если ни одно из вышеприведенных утверждений не нужно обрабатывать, обработайте меня». Это гарантирует, что сообщение отображается независимо от значения переменной $ action.

Ух ты — достаточно учишься? Я так не думаю … продолжайте читать.

3) Отправка электронной почты с помощью Perl

К счастью, Perl-скрипты имеют возможность отправлять электронную почту. Не только это, но текст внутри электронного письма и адрес, на который оно отправлено, могут быть указаны с помощью переменных. Вы знаете, что это значит: пользователи вводят свои адреса электронной почты и получают почти мгновенные электронные письма с подтверждением! Не волнуйтесь, делать это совсем не так. Создайте файл с именем email.html и используйте этот HTML-код внутри него:

<html>
<head>
<title>Signup Page</title>
</head>

<Тело>
<h3> Зарегистрируйтесь сегодня! </ h3>
<form action = «http://www.yourdomain.com/cgi-bin/email.cgi» method = «post»>
<br>
<b> Адрес электронной почты: </ b> <input type = «text» name = «email»>
<br>
<input type = «submit» value = «Регистрация»>
</ Body>
</ Html>

Еще раз, не забудьте заменить URL-адрес действия формы на путь к файлу email.cgi. Затем создайте новый текстовый файл, назовите его «email.cgi» и введите его в него (первые несколько строк должны выглядеть знакомо):

#!/usr/local/bin/perl
require "subparseform.lib";
&Parse_Form;
$email = $formdata{'email'};

Хорошо, теперь мы переходим на неизведанную территорию. Готовьтесь:

open (EMAILS, ">>emails.txt");
flock(EMAILS, 2);
print EMAILS "$emailn";
flock(EMAILS, 8);
close (EMAILS);

Давайте возьмем эту строку за раз. Первая строка говорит скрипту открыть файл — emails.txt. Если этот файл не существует, Perl создаст его самостоятельно. Если вы планируете позволить Perl создавать файл, убедитесь, что в вашем каталоге установлены необходимые разрешения. Если вы не знаете, что я имею в виду под разрешением каталога, просто загрузите пустой текстовый файл с именем emails.txt в тот же каталог, что и email.html и email.cgi. Первая строка в сценарии также присваивает файлу имя: «EMAILS».

Во втором подобии используется нечто, называемое «блокировка файлов». Это сделано для того, чтобы убедиться, что открываемый файл не изменяется, пока скрипт все еще обрабатывает этот код. Представьте себе, что может случиться, если кто-то воспользуется этим сценарием, пытаясь ввести свою информацию в emails.txt так же, как кто-то другой делает то же самое? Что пойдет первым? Это оставляет потенциал для коррупции и кучу перепутанного текста.

Блокировка файлов здесь явно сокращена до «скопления». В этом случае он используется, чтобы убедиться, что никакому другому сценарию, вызывающему файл emails.txt, не будет разрешено открывать его для использования, пока этот сценарий не использует его или пока не завершится команда блокировки файла.

Третья строка проста: она печатает все, что пользователь ввел в поле «email» в emails.txt, за которым следует разрыв строки, представленный здесь символом новой строки: « n

Введите это следующее:

print "Content-type: text/htmlnn";
print "The email address '$email' has been successfully entered. ";
print "Thank you. You will receive a confirmation email shortly.";

Четвертая строка разблокирует файл emails.txt для использования в другом месте, а пятая строка официально закрывает его. В случае, если это пока не очевидно, этот скрипт берет адрес электронной почты, введенный пользователем, вводит его в файл emails.txt, начинает новую строку и выполняет все заново при следующем вводе электронной почты. , Благодаря этому вы можете разрешить людям заполнять форму, сохранять электронную почту в текстовом файле и просматривать ее в любое время. Адреса будут разбиты так, что по одному адресу в каждой строке файла.

Но как насчет электронного письма с подтверждением, которое мы обещали пользователю в приведенном выше заявлении? Не бойтесь, вот код:

$from = "[email protected]";
open (MAIL, "|/usr/sbin/sendmail -t") || &ErrorMessage;
print MAIL "To: $email nFrom: $fromn";
print MAIL "Subject: Confirmation Emailn";
print MAIL "Thank you for signing up. Your email address ($email) has been successfully ";
print MAIL "stored. Have a nice day.n";
close (MAIL);
sub ErrorMessage {
print "<P>The server has a problem. Aborting script. n";
exit;
}

Первая строка дает значение переменной $ from — измените текст «[email protected]», чтобы он отражал ваш адрес, но убедитесь, что обратный слэш находится перед символом «@». Это необходимо, чтобы избежать ошибки разбора.

Во второй строке указывается путь к «sendmail» на вашем сервере, и если он неправильный или не найден по какой-либо причине, он отображает сообщение об ошибке, найденное под заголовком «sub ErrorMessage».

Строки 3, 4 и 5 печатают текст в электронном письме… он печатает небольшой заголовок, показывающий, кому было отправлено электронное письмо ($ email, электронное письмо, которое пользователь ввел в форму), и адрес человека, отправляющего электронное письмо ( $ от). Строка 6 закрывает письмо, а остальное — вышеупомянутое сообщение об ошибке.

Вот весь скрипт mail.cgi:

#!/usr/local/bin/perl

требуют «subparseform.lib»;
& Parse_Form;

$ email = $ formdata {’email’};

open (EMAILS, «>> emails.txt»);
стая (EMAILS, 2);
распечатать EMAILS «$ emailn»;
стая (EMAILS, 8);
закрыть (EMAILS);

напечатать «Content-type: text / htmlnn»;
print «Ваш адрес электронной почты ($ email) был успешно введен.»;
распечатать «Спасибо. Вы получите подтверждение по электронной почте в ближайшее время.»;

$ from = «[email protected]»;
open (MAIL, «| / usr / sbin / sendmail -t») || &Сообщение об ошибке;
выведите ПОЧТУ «Кому: $ email nFrom: $ fromn»;
печать ПОЧТА «Подтверждение Emailnn»;
print MAIL «Благодарим Вас за регистрацию. Ваш адрес электронной почты ($ email) был успешно»;
печать ПОЧТА «сохранено. Хорошего дня.n»;
закрыть (ПОЧТА);
sub ErrorMessage {
print «<P> На сервере возникла проблема. Сценарий прерывания. n»;
выход;
}

4) Подведение итогов

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

Надеюсь, теперь вы будете смотреть на Perl и другие языки программирования с уверенностью, а не со страхом. Не стесняйтесь использовать и изменять код, представленный здесь, почти как если бы он был вашим.

Удачи и счастливого кодирования!