Perl — Practical Extraction and Report Language - язык извлечения данных и составления отчетов. Удобен и популярен за счет легкой расширяемости, лингвистической основы синтактсиса, мощных инструментов для обработки произвольных текстовых данных.

На хостинге используется стандартная поставка Perl 5.8 из состава FreeBSD.

Запуск Perl

Как определить, установлен ли модуль Perl?

Установка модуля

Не работает скрипт. Ошибки

Встроенный отладчик Perl

Часто задаваемые вопросы по работе с Perl на хостинге

Примеры некоторых скриптов


Запуск Perl 

Для начала, путь к перлу: /usr/bin/perl

В начале каждого скрипта должно быть написано:

#!/usr/bin/perl

Как вариант, если прописать первой строчкой скрипта:

#!/usr/bin/perl -w (также включается директивой use warnings;)

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

Можно также в самом скрипте написать:

use CGI::Carp 'fatalsToBrowser';

Это включит режим, оптимальный для выдачи ошибок прямо в браузер. Иначе, скорее всего, будет выдаваться страница ошибки Web-сервера с кодом 500 ("Internal Server Error"). Данный режим по соображениям безопасности рекомендуется использовать только во время отладки скриптов. Подробности можно узнать в руководстве к модулю CGI::Carp, которое можно прочесть командой

perldoc CGI::Carp

Как определить, установлен ли модуль Perl? 

Для этого нужно точно знать название модуля, учитывая регистр букв.

В общем случае нужно выполнить на сервере, где находится ваш хостинг, в командной строке команду:

$ perl  -Mназваниемодуля -e ""

Вариантов два: если модуль есть, то команда просто выполнится, не выводя ошибок:

$ perl -MDATA::CALC  -e ""
$

Если же модуля нет - будет ошибка, сообщающая о том, что модуль не найден:

 $ perl -MDATA::CALC -e ""
Can't locate DATA/CALC.pm in @INC (@INC  contains: /site/perl/lib
/site/perl/sys /site/perl/sys
/usr/local/lib/perl5/site_perl/5.005/i386-freebsd
/usr/local/lib/perl5/site_perl/5.005 ./usr/libdata/perl/5.00503/mach
/usr/libdata/perl/5.00503).
BEGIN failed--compilation aborted.
$

Установка модуля 

Любой модуль Perl вы можете собрать самостоятельно. Обратите внимание на то, что в таком случае установлен он будет только для вас и работать будет из вашей домашней директории.

Скачайте модуль, распакуйте его и выполните следующие действия:

  1. Зайдите на сервер по ssh со своими доступами;
  2. Пропишите в ~/.profile:

    PERL5LIB=/site/perl/lib:/site/perl/sys:/home/client0/perl/lib:/home/client0/perl/lib/perl5/site_perl/5.8.8:/home/client0/perl/lib/perl5/site_perl/5.8.8/mach:/home/client0/perl/lib/perl5/site_perl/5.8.8/mach/auto
    export  PERL5LIB

    (где client0 - ваш логин).

  3. Далее симулируем full login:

    [client0@cpXX  ~]$ su -l client0

    Командой export можно посмотреть, обновились ли данные, прописанные в .profile:

    [client0@cpXX  ~]$ echo "$PERL5LIB"
    /home/client0/perl/lib:/home/client0/perl/lib/perl5/site_perl/5.8.8:/home/client0/perl/lib/perl5/site_perl/5.8.8/mach:/home/client0/perl/lib/perl5/site_perl/5.8.8/mach/auto"

    Как видим, обновились (если нет, делаем logout и login заново, обязательно в full login!)

  4. Установка модуля: перейдите в папку с модулем и выполните следующее:

    perl  Makefile.PL prefix=/home/client0/perl
    make
    make test
    make install

Если модуль просит предварительно установки других модулей, значит ставим сначала их, точно таким же образом.

Во время инсталляции модуль "скажет", что не может зарегистрировать себя на сервере (например: ./var/db/pkg: permission denied.) - это нормально. Модуль был установлен, просто не зарегистрирован как общесерверный.

Если вы установили вспомогательный модуль, но основной всё равно говорит, что его не хватает, то смотрите, где основной модуль ищет, и куда вспомогательный реально установлен. В случае необходимости, нужно будет добавить соответствующий путь в переменную PERL5LIB:

PERL5LIB="$PERL5LIB:/home/client0/папка"
export  PERL5LIB

Затем сделать logout, login. Как вариант, можно в каждом скрипте писать:

use lib  "/home/client0/папка";

Не работает скрипт. Ошибки 

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

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

Рекомендуем выводить ошибки интерпретатора Perl при тестировании работы скрипта в окно браузера. Для установки данного режима на время отладки необходимо вписать в начало скрипта (но не первой строкой!) следующее:

use CGI::Carp 'fatalsToBrowser';

Ошибки доступа к файлам и интерпретатору Perl (не дают операционной системе запустить Perl, который собственно и должен выполнить программу (скрипт) ).

Первая строка скрипта должна содержать правильный путь к интерпретатору Perl:

#!/usr/bin/perl

Работоспособность других вариантов написания строки возможна, но не гарантируется.

Если при попытке открыть страницу в браузере выдаётся сообщение: "Выполнение cgi-скрипта невозможно. Попробуйте позже", то, скорее всего, в скрипте после пути к Perl стоит символ перевода строки (в редакторе vi он показывается как "^M"). Этот символ нужно удалить.

Права для CGI-скриптов, а также для папки, содержащей их, должны быть выставлены "rwxr-xr-x". Это можно сделать командой

chmod 755 файл_или_папка_1 файл_или_папка_2

Для обеспечения работоспособности всех Perl-скриптов можно использовать следующую команду:

find  /home/client0/public_html -type f -name '*.pl' -print0 | xargs -0 chmod 0755

Эта команда найдёт в папке public_html, находящейся в домашней директории, все файлы с расширением ".pl" (это обычное расширение для скриптов на Perl; не возбраняется использовать и другое расширение, например, ".cgi") и выставит для них правильные права.


Синтаксические ошибки (не дают Perl выполнить скрипт).

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

perl -с ваш_скрипт

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

can't find  string terminator '"' anywhere before EOF
file qwerty.cgi; line 3

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

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

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

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

Пример ошибки:

Can't locate AGAGAGA.pm in @INC (@INC contains: /usr/local/lib/perl5/5.8.8/BSDPAN /usr/local/lib/perl5/site_perl/5.8.8/mach 
/usr/local/lib/perl5/site_perl/5.8.8 /usr/local/lib/perl5/site_perl /usr/local/lib/perl5/5.8.8/mach /usr/local/lib/
perl5/5.8.8 .). BEGIN failed--compilation aborted.

В этом случае проверьте написание названия модуля, находится ли он в одной из перечисленных в сообщении об ошибке папок и вообще, установлен ли.


Встроенный отладчик Perl 

Здесь содержатся базовые сведения об использовании отладчика Perl. Больше информации доступно в man-страницах "perldebtut" и "perldebug". Команду "man" можно ввести прямо в процессе отладки, но обычно удобнее иметь руководство, открытым в отдельном окне.


Запуск и выход из отладчика

Perl позволяет произвести детальную диагностику программы при помощи встроенного отладчика. Для включения отладчика достаточно запустить Perl с параметром "-d", например:

$ perl -d  xxx.pl
Loading DB  routines from perl5db.pl version 1.28
Editor  support available.
Enter h or  `h h' for help, or `man perldebug' for more help.
main::(xxx.pl:5):       my $x = "Hello World!";
DB<1>

В предпоследней строке данного сообщения отладчика выводится содержимое текущей (первой в очереди на выполнение) строки программы. Нижняя строка - это само приглашение; она дает вам знать, что отладчик готов к приему команд. Число в угловых скобках является счётчиком команд, оно увеличивается на единицу с каждой введённой в отладчик командой.


Основные команды отладчика

Ввод каждой команды завершается нажатием на клавишу "Enter".

Чтобы выйти из отладчика, введите команду "q".

Полный список команд отладчика можно получить, введя команду "h". Подробную информацию о любой команде отладчика можно получить, введя "h команда".

Почти все команды отладчика состоят из одного или двух символов, за которыми (для некоторых команд) может или должен следовать аргумент. Ниже приведена краткая справка по наиболее полезным командам отладчика:



Команда Что делает Примеры
l (строчная английская "L") Показывает строки текста программы Показать текущую строку программы и соседние с ней: l
Показать текст подпрограммы (процедуры, функции) mysub: l mysub
Показать девятую строку программы: l 9
Показать строки программы с одиннадцатой по двадцатую: l 11-20
v Показывает строки текста программы вокруг заданной строки Показать текущую строку программы и соседние с ней: v
Повторный ввод команды "v" без параметров покажет следующие несколько строк
Показать пятнадцатую строку и соседние с ней: v 15
. (точка) Возвращает к текущей строке программы Вернуться к текущей строке программы и показать её: .
R Перезапускает программу Запустить программу заново, с первой строчки: R
<
и
>
Управляют списком команд Perl (не отладчика!), которые будут выполняться, соответственно, до или после отображения приглашения отладчика Показать текущий список команд, автоматически выполняющихся перед показом приглашения отладчика: < ?
Автоматически печатать содержимое переменной $x перед каждым показом приглашения отладчика: < print "$x\n"
В дополнение к имеющимся автоматически выполняемым командам, сбрасывать значение последнего элемента массива @y в 42 после ввода команды в отладчике: >> $y[$#y] = 42
Убрать все команды, автоматически выполняющиеся перед показом приглашения отладчика: < *
n и s Выполнить текущую строку программы, соответственно, без и с заходом в подпрограммы

Часто задаваемые вопросы по Perl 

  1. Если для работы какого-то perl-скрипта в составе размещенного у вас сайта (по плану Normal или Profy) потребуется perl-модуль, не установленный на Вашем сервере, вы его добавите?

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

  2. Какие права должны стоять на файлах perl-скриптов?

    Как и на все cgi-приложения, права должны быть 755.

  3. Где хранятся логи?

    Логи перл-скриптов пишутся в файл ~/log/script. Если этого файла нет, его надо создать, чтобы он мог пополняться.

  4. Как определить, где Perl ищет свои библиотеки и модули?

    perl -e 'print join("\n", @INC);'
  • Я установил права доступа такими, как рекомендовано в памятке (711 на cgi-bin и 700 на .pl-файл, который прилагается). Однако при попытке обращения к скрипту выдается ошибка
    "Выполнение CGI приложения невозможно. Попробуйте позже.", в log при этом ничего не записывается.

    С правами 700 скрипт будет работать только, если его запускать прямо на сервере, через шелл, но не из сети. Необходимо поставить права 755.

  • Необходимо, чтобы скрипт запускался по расписанию, например, N раз в сутки. Возможно ли это?

    Запустить скрипт один или несколько раз по расписанию можно с помощью планировщика Cron. Инструкции по работе с Cron из панели управления и через SSH есть также у нас в FAQ.

  • Не работает скрипт: при попытке открыть его в браузере выдаётся сообщение "Выполнение cgi-скрипта невозможно. Попробуйте позже."

    Скорее всего, в скрипте после пути к Perl (первая строка) стоит символ "^M" (перевод каретки в Windows). Его нужно удалить.

  • Как можно получить более подробную информацию о причине ошибок скриптов?

    Для этого в домашнем каталоге необходимо создать папку log, а в ней файлы error и script, причины ошибок будут писаться в них.

  • Через командную строку скрипт выплняется, а при вызове в браузере дает 500 ошибку, в чем может быть проблема?

    Перед всей выходной информацией CGI-программы, предназначенной для браузера, должен идти правильный HTTP-заголовок. Например, при генерации HTML-страницы, в самое начало скрипта добавьте строчку: print "Content-Type: text/html\n\n";

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

  • Примеры некоторых скриптов 

    Отправка писем

    #!/usr/bin/perl
    use strict;
    use MIME::Lite;
    
    my $from = 'Sender <sender@server.com>';
    my $to = 'Recipient <recipient@server.com>';
    my $subject = 'subject';
    my $data = "text text text";
    
    my $msg = MIME::Lite->new (
    From => $from,
    To => $to,
    Subject => $subject,
    Data => $data
    ); $msg->send;

    Отправка писем с вложениями

    #!/usr/bin/perl
    use strict;
    use MIME::Lite;
    
    my $from = 'Sender <sender@server.com>';
    my $to = 'Recipient <recipient@server.com>';
    my $subject = 'subject';
    my $data = "text text text";
    
    my $msg = MIME::Lite->new (
    From => $from,
    To => $to,
    Subject => $subject,
    Type    => 'multipart/mixed');
    );
    $msg->attach(Type => 'text/plain; charset=windows-1251',
    Data => $data);
    
    $msg->attach(Type => 'image/gif',
    Path => 'my_image.gif',
    Filename => 'image.gif',
    Id => 'image.gif',
    Disposition => 'attachment');
    
    $msg->attach(Type => 'application/x-zip-compressed',
    Path => 'my_file.zip',
    Filename => 'file.zip',
    Disposition => 'attachment');
    $msg->send;
    

    Загрузка файлов

    #!/usr/bin/perl -w
    use strict;
    use CGI;
    my $req = new CGI; print "Content-type: text/html\n\n"; print qq| <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>Some page title</title> </head> <body> |;
    if (defined $req->param("upload_file") and defined $req->param("myfile") and $req->param("myfile") ne "") { my $target_file = "/home/login/targetfile"; my $source_file = $req->param("myfile"); open TARGET_FILE, ">$target_file"; print TARGET_FILE while <$source_file>; close TARGET_FILE; print "Look at $target_file"; }
    print qq| <form method = "POST" enctype = "multipart/form-data"> <input type = "file" name = "myfile"> <input type = "submit" name = "upload_file"> </form> </body> </html> |;

    Работа с СУБД MySQL

    Основным инструментом для доступа к СУБД в perl является модуль DBI (Data Base Interface), к которому подключается DBD (Data Base Driver) - модуль для взаимодействия с конкретной СУБД.

    #!/usr/bin/perl
    use strict;
    use DBI;
    

    # соединяемся с СУБД

    my $database = "my_db";
    my $db_server = "localhost";
    my $user = "me";
    my $password = "my_passwd";
    my $dbh = DBI->connect("DBI:mysql:$database:$db_server",$user,$password);
    

    # в зависимости от того, будет ли запрос что-то возвращать или нет, используем методы do или prepare.

    # пример использования do

    $query = "insert into my_table (my_field1, my_field2) values 
    ('$field1','$field2')";
    $dbh->do($query);
    

    # пример использования prepare

    my $query = "select my_field, my_field from my_table";
    my $sth = $dbh->prepare($query);
    $sth->execute();

    # можно также использовать fetchrow_arrayref или fetchrow_hashref

    my ($field1, $field2) = $sth->fetchrow_array();
    $sth->finish();
    $dbh->disconnect();

    Вы ознакомились с наиболее часто задаваемыми вопросами, но не нашли нужного ответа? Или информации на сайте оказалось недостаточно?

    Тогда напишите нам!

    *Ваш e-mail:

     Номер вашего Лицевого счета:

     Категория вопроса:

    *Вопрос:

    *Введите отображаемый код: