Отладка CGI-скриптов на Perl


Оглавление (нажмите, чтобы открыть):

Как я могу отлаживать CGI Perl script?

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

script довольно прост; он подключается через expect и ssh к сетевым устройствам и собирает данные. Для целей отладки я работаю только с частью, которая собирает список интерфейсов с устройства.

script на новом сервере всегда показывает мне страницу в течение примерно 5 секунд после ее перезагрузки. Редко он включает в себя список интерфейсов с удаленного устройства. Чаще всего он содержит все элементы HTML, кроме списка интерфейсов.

Теперь, на старом сервере, иногда script потребуется 20 секунд для вывода данных. Это было хорошо.

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

Дополнительная информация: К сожалению, я не могу опубликовать какую-либо политику работы с кодом. Тем не менее, я уверен, что это не проблема с ожиданием. Части ожидания записываются как expect() или die (‘error msg’), и я не вижу сообщений об ошибках. Однако, если я устанавливаю время ожидания ожидания равным 0, я вижу сообщения об ошибках.

Значение ожидания ожидания ожидания, используемое в script, обычно составляет 20 секунд. но, как я уже упоминал выше, apache отображает статическое содержимое из script примерно через 5 секунд, а 95% времени не отображается содержимое, которое следует извлечь из ожидаемого. Кроме того, script записывает ожидаемое содержимое в файл на диске — даже если страница не отображает его.

Perl и CGI программы — особенности использования

Содержание

1. Использование готовых скриптов

Если у вас уже есть написанные CGI-скрипты, то прежде чем скопировать их на сервер, вы должны сделать следующие действия:

  • Убедиться, что в скриптах указан правильный путь к интерпретатору:
    • Perl: /usr/bin/perl
    • Python: /usr/local/bin/python
  • Если вашему скрипту требуется доступ к базе данных MySQL, то необходимо указать параметры доступа:
    • MySQL — создание и управление базами данных
  • В разделе панели управления хостингом «Веб-сервер»«Управление модулями» включить модуль CGI.

Теперь вы можете скопировать свои скрипты на сервер.

Загружать файлы необходимо в каталог ваш_домен/cgi. Файлы из данного каталога будут доступны по адресу https://ваш_домен/cgi-bin/имя_файла.

Для того чтобы CGI-скрипты запускались из корневого каталога сайта ваш_домен/docs, необходимо создать в нем файл .htaccess со следующим содержимым:

На скрипты необходимо установить атрибут исполнения (права доступа 755 или -rwxr-xr-x).

Атрибуты можно изменить с помощью файлового менеджера панели управления.

2. Написание простейшего CGI-скрипта

Рассмотрим написание простого CGI скрипта на Perl.

Если вы работаете под управлением ОС Windows, то для работы с кодом скриптов вам необходимо использовать специализированный текстовый редактор, например, Notepad++. Стандартную для Windows программу «Блокнот» лучше не использовать. Для демонстрации работы CGI скрипта необходимо создать два файла. Первый файл представляет собой html-документ с формой ввода текста:

Второй файл является CGI-скриптом

Первый файл вы можете разместить в каталоге ваш_домен/docs. Второй файл вы должны разместить в директории ваш_домен/cgi. Обязательно проверьте права на ваш CGI-скрипт. Они должны быть установлены в значение -rwxr-xr-x или 755.

3. Просмотр установленных модулей PERL

Для проверки установленных PERL-модулей необходимо последовательно выполнить следующие действия:

    Зайти по SSH-протоколу на веб-сервер и выполнить команду:

Таким образом будет создан файл modules.pl

Теперь необходимо его отредактировать, для этого нажмем Insert, напишем следующее:

Для выхода из редактора с сохранением только что набранного текста, нажимаем Esc и затем :wq

  • Можем посмотреть установленные модули:
  • 4. Установка дополнительных модулей PERL

    Вы можете установить на хостинг дополнительные модули PERL из исходных кодов. Прежде чем приступать к установке, подключите последнюю версию PHP в разделе «Веб-сервер» — «Управление модулями» панели управления хостингом, при этом будет подключен обновленный набор программного обеспечения, который может включать в себя нужный вам модуль Perl.

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

    • Для этого подключитесь к хостингу по SSH и создайте в домашнем каталоге файл .bashrc с помощью команды:
    • Чтобы изменения вступили в силу, выполните команду:

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

    • на странице https://search.cpan.org/ найдите нужный модуль, например, Net::SMPP и скопируйте ссылку для загрузки архива с исходными кодами модуля,
    • подключитесь к хостингу по SSH и перейдите в каталог для временных файлов
    • загрузите архив на хостинг по найденной ссылке с помощью wget
    • распакуйте архив и перейдите в каталог с исходными кодами модуля

    Установку необходимо выполнять в отдельный каталог, например, /home/login/PERL, где login – идентификатор услуги хостинга, указав переменную INSTALL_BASE.

    • Для установки модуля с помощью файла Makefile.PL используйте команды:
    • Для установки модуля с помощью файла Build.PL используйте команды:

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

    Для того чтобы веб-сервер Apache мог работать с дополнительными модулями, необходимо в панели управления хостингом включить модуль env_module и добавить следующие строки в файл .htaccess в корневом каталоге сайта или в каталоге с CGI-скриптами:

    где login – идентификатор услуги хостинга.

    5. Возможные ошибки

    Если при обращении к скрипту вы видите сообщение об ошибке 403, это значит, что на скрипт установлены некорректные права доступа. На CGI-скрипты необходимо установить атрибут исполнения (права доступа 755 или -rwxr-xr-x). Атрибуты можно изменить с помощью файлового менеджера панели управления.

    Если во время запуска своего скрипта вы видите сообщение о 500-ой ошибке, это значит что в скрипте есть какая-то ошибка из-за которой транслятор Perl’а не может успешно завершить свою работу. Ошибка может быть как синтаксическая (например вы забыли где-то закрыть кавычку или фигурную скобку), так и логическая, например в результате каких-либо ваших действий происходит деление на ноль. Для того чтобы понять причину ошибки, вам необходимо посмотреть логи веб-сервера, которые хранятся в каталоге ваш_домен/logs.

    Как я могу устранить свой скрипт CGI Perl?

    У меня скрипт Perl, который не работает, и я не знаю, как начать сужение проблемы. Что я могу сделать?

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

    Используете ли вы обработчик ошибок во время отладки?

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

    Один из способов сделать это — позвонить

    в верхней части вашего скрипта. В этом вызове будет установлен обработчик $SIG <__DIE__>(см. perlvar ), отображающий фатальные ошибки в вашем браузере, при необходимости добавив к нему допустимый заголовок. Другой отладочный трюк CGI, который я использовал до того, как я когда-либо слышал о CGI::Carp заключался в том, чтобы использовать eval с объектами DATA и __END__ на скрипте, чтобы поймать ошибки во время компиляции:

    Этот более подробный метод имеет небольшое преимущество перед CGI::Carp в том, что он будет ловить больше ошибок во время компиляции.

    Обновление: я никогда не использовал его, но похоже, что CGI::Debug , как предложил Mikael S, также очень полезный и настраиваемый инструмент для этой цели.

    Я думаю, что CGI::Debug тоже стоит упомянуть.

    Интересно, почему никто не упоминал опцию RemotePort под названием RemotePort ; хотя, по общему признанию, в Интернете мало рабочих примеров ( RemotePort даже не упоминается в perldebug ) — и для меня было проблематично придумать этот perldebug , но здесь он идет (это пример Linux).

    Чтобы сделать правильный пример, сначала мне нужно было что-то, что могло бы сделать очень простое моделирование веб-сервера CGI, желательно через одну командную строку. После поиска Simple web-сервера командной строки для запуска cgis. (perlmonks.org) , я нашел для этого теста IO :: All — Tiny Web Server .

    Здесь я буду работать в каталоге /tmp ; сценарий CGI будет /tmp/test.pl (см. ниже). Обратите внимание, что сервер IO::All будет обслуживать только исполняемые файлы в том же каталоге, что и CGI, поэтому здесь требуется chmod +x test.pl Итак, чтобы выполнить обычный пробный запуск CGI, я меняю каталог на /tmp в терминале и запускаю там однострочный веб-сервер:

    Команда webserver будет блокироваться в терминале и в противном случае будет запускать веб-сервер локально (на 127.0.0.1 или localhost ) — впоследствии я могу перейти в веб-браузер и запросить этот адрес:

    . и я должен следить за print сделанной test.pl , загруженной — и отображаемой — в веб-браузере.

    Теперь, чтобы отладить этот сценарий с помощью RemotePort , сначала нам нужен прослушиватель в сети, через который мы будем взаимодействовать с отладчиком Perl; мы можем использовать инструмент командной строки netcat ( nc , увиденный здесь: Perl 如何 удаленная отладка? ). Итак, сначала запустите прослушиватель netcat в одном терминале, где он будет блокировать и ждать соединений на порту 7234 (который будет нашим портом отладки):

    Затем нам нужно, чтобы perl запускался в режиме отладки с помощью RemotePort , когда был вызван test.pl (даже в режиме CGI, через сервер). Это, в Linux, можно сделать, используя следующий сценарий «shebang wrapper», который также должен быть в /tmp , и должен быть выполнен как исполняемый файл:

    Это своего рода сложная вещь — см. Сценарий оболочки. Как я могу использовать переменные среды в моем shebang? — Unix и Linux Stack Exchange . Но трюк здесь, похоже, не в том, чтобы test.pl интерпретатор perl который обрабатывает test.pl — поэтому, как только мы его test.pl , мы не выполняем, но вместо этого мы называем perl «прямо» и в основном «источником» нашего test.pl script using do (см. Как запустить скрипт Perl из скрипта Perl? ).

    Теперь, когда у нас есть perldbgcall.sh in /tmp — мы можем изменить файл test.pl , так что он ссылается на этот исполняемый файл на своей строке shebang (вместо обычного интерпретатора Perl) — здесь /tmp/test.pl изменен таким образом:

    Теперь и test.pl и его новый обработчик shebang, perldbgcall.sh , находятся в /tmp ; и у нас есть nc слушая отладочные соединения на порту 7234, — поэтому мы можем, наконец, открыть другое окно терминала, сменить каталог на /tmp и запустить однострочный веб-сервер (который будет прослушивать веб-соединения на порту 8080):

    После этого мы можем перейти в наш веб-браузер и запросить тот же адрес, https://127.0.0.1:8080/test.pl . Однако теперь, когда веб-сервер пытается выполнить скрипт, он сделает это через perldbgcall.sh shebang — который запустит perl в режиме удаленного отладчика. Таким образом, выполнение скрипта приостанавливается — и поэтому веб-браузер блокируется, ожидая данных. Теперь мы можем переключиться на терминал netcat , и мы должны увидеть знакомый текст отладчика Perl, однако вывод через nc :

    Как показывает фрагмент, мы теперь в основном используем nc как «терминал», поэтому мы можем ввести r (и Enter) для «run» — и скрипт будет запускаться в оператор breakpoint (см. Также In perl, в чем разница между $ DB :: single = 1 и 2? ), прежде чем снова остановиться (обратите внимание, что в этот момент браузер все равно заблокируется).

    Итак, теперь мы можем, скажем, пройти через остальную часть test.pl через терминал nc :


    . однако, и в этот момент браузер блокирует и ждет данных. Только после выхода из отладчика с q :

    . блокирует блокировку браузера и, наконец, отображает (полный) вывод test.pl :

    Конечно, такой отладочный процесс можно сделать даже без запуска веб-сервера — однако, здесь есть что-то особенное: мы вообще не трогаем веб-сервер; мы запускаем выполнение «изначально» (для CGI) из веб-браузера — и единственным изменением, необходимым для самого скрипта CGI, является изменение shebang (и, конечно же, наличие скрипта оболочки shebang в качестве исполняемого файла в том же каталог).

    Ну, надеюсь, это поможет кому-то — я бы наверняка любил бы наткнуться на это, вместо того, чтобы писать сам 🙂
    Ура!

    Для меня я использую log4perl . Это очень полезно и легко.

    Честно говоря, вы можете сделать все самое интересное над этим сообщением. ПОТОМУ ЧТО, самое простое и наиболее проактивное решение, которое я нашел, это просто «распечатать».

    В примере: (обычный код)

    Чтобы узнать, делает ли он то, что я действительно хочу сделать: (Устранение неполадок)

    Этот ответ предназначен как общая структура для работы с проблемами с Perl CGI-сценариями и первоначально появилась на Perlmonks как « Устранение неполадок Perl CGI Scripts» . Это не полное руководство по каждой проблеме, с которой вы можете столкнуться, ни учебник по раздаче ошибок. Это всего лишь завершение моего опыта отладки сценариев CGI за десять (плюс!) Лет. На этой странице было много разных домов, и я, кажется, забыл, что это существует, поэтому я добавляю его в . Вы можете отправить мне любые комментарии или предложения по адресу [email protected] Это также вики-сообщества, но не стоит чересчур гадать. 🙂

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

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

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

    Если вам нужна дополнительная информация, чем короткое предупреждающее сообщение, используйте прагму diagnostics для получения дополнительной информации или посмотрите в документации perldiag :

    Вы сначала вывели действительный заголовок CGI?

    Сервер ожидает, что первый вывод из CGI-скрипта будет заголовком CGI. Обычно это может быть так же просто, как print «Content-type: text/plain\n\n»; или с CGI.pm и его производными, print header() . Некоторые серверы чувствительны к выходу ошибок (на STDERR ), которые отображаются до стандартного вывода (на STDOUT ).

    Попробуйте отправить ошибки в браузер

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

    Что сказал журнал ошибок?

    Серверы хранят журналы ошибок (или они должны, по крайней мере). Ошибка вывода с сервера и из вашего сценария должна появиться там. Найдите журнал ошибок и посмотрите, что он говорит. Не существует стандартного места для файлов журналов. Просмотрите конфигурацию сервера для своего местоположения или спросите администратора сервера. Вы также можете использовать такие инструменты, как CGI::Carp чтобы сохранить свои собственные файлы журналов.

    Каковы разрешения сценария?

    Если вы видите ошибки, такие как «Permission denied» или «Метод не реализован», это, вероятно, означает, что ваш скрипт не читается и не выполняется пользователем веб-сервера. По вкусам Unix рекомендуется изменить режим до 755: chmod 755 filename . Никогда не устанавливайте режим на 777!

    Используете ли вы use strict ?

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

    Скомпилирует сценарий?

    Вы можете проверить ошибки компиляции с помощью ключа -c . Сосредоточьтесь на первых сообщенных ошибках. Прополощите, повторите. Если вы получаете действительно странные ошибки, убедитесь, что ваш скрипт имеет правильные окончания строки. Если вы используете FTP в двоичном режиме, checkout из CVS или что-то еще, что не обрабатывает перевод строки, веб-сервер может видеть ваш сценарий как одну большую строку. Перенос Perl-скриптов в режиме ASCII.

    Является ли сценарий жалоб на небезопасные зависимости?

    Если ваш сценарий жалуется на небезопасные зависимости, вы, вероятно, используете ключ -T чтобы включить taint-режим, что хорошо, поскольку он позволяет вам передавать неконтролируемые данные в оболочку. Если он жалуется, он выполняет свою работу, чтобы помочь нам написать более безопасные сценарии. Любые данные, происходящие извне программы (т. Е. Среда), считаются испорченными. Переменные среды, такие как PATH и LD_LIBRARY_PATH являются особенно сложными. Вы должны установить их в безопасное значение или полностью отключить их, как я рекомендую. В любом случае, вы должны использовать абсолютные пути. Если проверка жалобы жалуется на что-то еще, убедитесь, что вы не очистили данные. Подробнее см. Страницу man perlsec .

    Что происходит, когда вы запускаете его из командной строки?

    Выводит ли сценарий то, что вы ожидаете при запуске из командной строки? Первый вывод заголовка, за которым следует пустая строка? Помните, что STDERR может быть объединен с STDOUT если вы находитесь на терминале (например, в интерактивном сеансе), и из-за буферизации может появиться в беспорядочном порядке. Включите функцию автозапуска Perl, установив $| к истинному значению. Обычно вы можете увидеть $|++; в программах CGI. После установки каждая печать и запись немедленно переходят на вывод, а не буферизируются. Вы должны установить это для каждого дескриптора файла. Используйте select чтобы изменить дескриптор файла по умолчанию, например:

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

    Что происходит, когда вы запускаете его из командной строки с CGI-подобной средой?

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

    Отменить или удалить эти переменные

    • PATH
    • LD_LIBRARY_PATH
    • все переменные ORACLE_*

    Установите эти переменные

    • REQUEST_METHOD (устанавливается в GET , HEAD или POST если необходимо)
    • SERVER_PORT (обычно — 80)
    • REMOTE_USER (если вы делаете защищенный доступ)

    В последних версиях CGI.pm (> 2.75) требуется флаг -debug для получения старого (полезного) поведения, поэтому вам, возможно, придется добавить его в свой импорт CGI.pm

    Вы используете die() или warn ?

    Эти функции печатаются в STDERR если вы не переопределили их. Они также не выводят заголовок CGI. Вы можете получить такую ​​же функциональность с такими пакетами, как CGI::Carp

    Что происходит после очистки кеша браузера?

    Если вы считаете, что ваш скрипт работает правильно, а когда вы выполняете запрос вручную, вы получаете правильный вывод, возможно, причиной этого является браузер. Очистите кеш и установите размер кеша на ноль во время тестирования. Помните, что некоторые браузеры действительно глупы и фактически не перезагружают новый контент, даже если вы говорите ему об этом. Это особенно распространено в случаях, когда путь URL-адреса одинаков, но содержимое изменяется (например, динамические изображения).

    Это сценарий, где вы так думаете?

    Путь файловой системы к скрипту необязательно напрямую связан с URL-адресом сценария. Убедитесь, что у вас есть правильный каталог, даже если вам нужно написать короткий тестовый скрипт, чтобы проверить это. Кроме того, вы уверены, что редактируете правильный файл? Если вы не видите каких-либо изменений в ваших изменениях, вы можете изменить другой файл или загрузить файл в неправильное место. (Это, кстати, моя самая частая причина таких неприятностей;)

    Используете ли вы CGI.pm или его производную?

    Если ваша проблема связана с анализом ввода CGI, и вы не используете широко проверенный модуль, такой как CGI.pm , CGI::Request , CGI::Simple или CGI::Lite , используйте модуль и продолжайте жизнь. CGI.pm имеет cgi-lib.pl совместимости cgi-lib.pl который может помочь вам решить проблемы ввода из-за более старых реализаций CGI-парсера.

    Вы использовали абсолютные пути?

    Если вы используете внешние команды с system , обратными тиками или другими объектами IPC, вы должны использовать абсолютный путь к внешней программе. Вы не только точно знаете, что используете, но и избегаете некоторых проблем с безопасностью. Если вы открываете файлы для чтения или записи, используйте абсолютный путь. Сценарий CGI может иметь другое представление о текущем каталоге, чем вы. Кроме того, вы можете сделать явный chdir() чтобы поместить вас в нужное место.

    Вы проверили свои возвращаемые значения?

    Большинство функций Perl скажут вам, работают ли они или нет, и установит $! при сбое. Вы проверили возвращаемое значение и изучили $! для сообщений об ошибках? Вы проверяли [email protected] если вы использовали eval ?

    Какую версию Perl вы используете?

    Последняя стабильная версия Perl — 5.16.2. Используете ли вы более старую версию? В разных версиях Perl могут быть разные идеи предупреждений.

    Какой веб-сервер вы используете?

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

    Вы проверили документацию на сервере?

    Серьезные программисты CGI должны знать как можно больше о сервере, включая не только возможности и поведение сервера, но и локальную конфигурацию. Документация для вашего сервера может быть недоступна для вас, если вы используете коммерческий продукт. В противном случае документация должна быть на вашем сервере. Если это не так, найдите его в Интернете.

    Вы искали архивы comp.infosystems.www.authoring.cgi ?

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

    Можете ли вы воспроизвести проблему с помощью короткого тестового сценария?

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

    Вы решили пойти посмотреть фильм?

    Шутки в сторону. Иногда мы можем быть настолько увлечены проблемой, что мы разрабатываем «сужение перцепции» (туннельное видение). Перерыв, получение чашки кофе или взрыв некоторых плохих парней в [Duke Nukem, Quake, Doom, Halo, COD] могут дать вам свежую перспективу, что вам нужно снова подойти к проблеме.

    Вы озвучили проблему?

    Серьезно снова. Иногда объяснение проблемы вслух приводит нас к нашим собственным ответам. Поговорите с пингвином (плюшевая игрушка), потому что ваши сотрудники не слушают. Если вы заинтересованы в этом как серьезном инструменте отладки (и я рекомендую его, если вы еще не нашли проблему), вам также может понравиться прочитать «Психология компьютерного программирования» .

    Вы можете запустить perl cgi-script в терминале, используя следующую команду:

    Он интерпретирует код и обеспечивает результат с помощью HTML-кода. Он будет сообщать об ошибке, если таковой имеется.

    Запуск интерпретатора и режим отладки

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

    Внутренний отладчик, которым снабжен интерпретатор peri, неоценим при отладке сложных сценариев Perl, особенно при разработке собственных модулей. Конечно, по общему признанию апологетов Perl, возможности его отладчика не так изощренны, как в С, C++ или Visual Basic, однако они могут оказаться мощным средством выявления ошибок, не обнаруживаемых самим компилятором даже в режиме отображения предупреждений.

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

    14.1. Опции командной строки

    Мастер Йода рекомендует:  Функции базы данных MySQL

    Наиболее общая форма синтаксиса строки запуска интерпретатора peri имеет следующий вид:

    peri [опции] [—] [файл_программы] [параметры_программы]

    Опции peri задаются сразу же после имени интерпретатора и представляют собой двухсимвольные последовательности, начинающиеся с дефиса «-«:

    peri -а -р prog.pl filel file2

    Некоторым из них может потребоваться передать параметры, которые задаются непосредственно после соответствующих опций:

    peri -w -I/usr/include -0055 prog.pl filel file2

    Опции без параметров можно группировать, задавая целую группу с одним дефисом. Следующие вызовы peri эквивалентны:

    peri -wd prog.pl filel file2 peri -w -d prog.pl filel file2


    Опции с параметрами таким способом задавать нельзя. Можно, однако, одну опцию с параметром добавить в конец группы опций без параметров:

    peri -wdl/usr/include -0055 prog.pl filel file2

    Передать опции для установки соответствующего режима работы интерпретатора можно непосредственно и из самой программы Perl. Первая строка сценария со специальным комментарием #! предназначена именно для этой цели:

    #!/usr/bin/perl -w -d -I/usr/include

    Теперь настало время узнать, какие опции существуют и как они влияют на режим работы интерпретатора. Мы решили сначала перечислить все возможные опции peri, а потом объяснить использование некоторых из них для выполнения задач системного администрирования UNIX. В табл. 14.1 представлены все опции с их кратким описанием. Советуем читателю внимательно ознакомиться с содержанием этой таблицы, так как для некоторых опций приведенное краткое описание в то же время является и исчерпывающим для понимания существа данной опции.

    Таблица 14.1. Опции командной строки

    Задает разделитель записей файла ввода, устанавливая значение специальной переменной $/. Необязательный параметр nnn — восьмеричный код символа; если отсутствует, принимается равным 0 (код символа \0). Эта опция удобна, если при каждом запускесценария Perl в него необходимо передавать файлы с разными символами завершения записи

    Включает режим авторазбиения строки ввода при совместном использовании с опцией -п или -р (строка передается функции split ( > , а результат ее выполнения помещается в специальный массив @г). Умалчиваемый разделитель — пробел; опция -F позволяет задать регулярное выражение для иного разделителя

    Проверка синтаксиса программы без ее выполнения (блоки BEGIN, END и use выполняются, так как это необходимо для процесса компиляции)

    Запускает сценарий в режиме отладки под управлением модуля отладки или трассировки, установленного как

    Устанавливает флаги отладки

    Выполнение строки кода Perl, заданной параметром этой опции, а не файла сценария файл_программы, указанного в командной строке вызова интерпретатора. В строке кода можно задать несколько операторов, разделенных символом ‘;’. Допускается задание нескольких опций -е. (В Windows строка кода задается в двойных кавычках и для использования самих кавычек в коде Perl необходимо применять управляющую последовательность \».)

    Задает регулярное выражение для разделителя при автоматической разбивке строки файла ввода в случае задания опции -а. Например, -F/-.+/ определяет в качестве разделителя одно или более двоеточий. По умолчанию используется пробел / /. Символы «/» при задании per выраж не обязательны

    Задает режим редактирования по месту файла, переданного как параметр в сценарий Perl. Используется совместно с опциями -п или -р. Редактирование выполняется по следующей схеме: файл переименовывается (если задано расширение), открывается файл вывода с именем исходного файла и все операции print ( ) сценария осуществляют вьшод в этот новый файл.

    Параметр расширение используется для задания имени копии файла по следующей схеме: если в нем нет символов «*», то оно добавляется в конец имени исходного файла; каждый символ «*» этого параметра заменяется именем исходного файла

    Задает каталог поиска сценариев Perl, выполняемых операциями do, require и use (сохраняется как элемент специального массива @INC). Также задает каталоги размещения файлов, включаемых в сценарий Perl директивой finclude препроцессора С. Можно использовать несколько опций для задания необходимого количества каталогов поиска

    Включает автоматическую обработку концов строк ввода. Работа в этом режиме преследует две цели:

    1. Автоматическое удаление завершающего символа записи, хранящегося в специальной переменной $/, при включенном режиме -п или -р;

    2. Присваивание специальной переменной $\, в которой хранится символ завершения записи при выводе операторами print, восьмеричного значения nnn, представляющего код символа завершения; если этот параметр не задан, то переменной $\ присваивается текущее значение $ /

    -m[-] мо дуль -М [ — ] модуль

    -[гаМ][-] модуль= пар! [ , пар2 ] . .

    Выполняет оператор use module О (опция -т) или use module (опция -м) перед выполнением сценария Perl. Если параметр модуль задан с дефисом, то use заменяется на по. Третья форма этих опций позволяет передать параметры в модуль при его загрузке

    Заданный сценарий Perl выполняется в цикле

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

    Аналогичен опции -п, но добавляется печать каждой обрабатываемой строки, как в редакторе sed:

    Перед компиляцией сценарий Perl обрабатывается препроцессором С, что позволяет использовать в нем команды препроцессора #define, # include и все команды условной компиляции С (#if, felse и т. д.). В опции -I можно задать каталоги расположения файлов, включаемых командой t include

    Включает режим синтаксического анализа строки вызова сценария Perl на наличие после имени файла сценария, но до параметров имен файлов «пользовательских опций» (параметров, начинающихся с дефиса). Такие параметры извлекаются из массива @ARGV и в программе объявляются и определяются переменные с именами введенных опций. Следующий сценарий напечатает «Задана опция optl» тогда и только тогда, когда он будет вызван с опцией -optl:

    Поиск файла программы Perl файл программы осуществляется с использованием значения переменной среды PATH

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

    Создание дампа ядра после компиляции сценария Perl. Последующее использование программы undump позволяет создать двоичный выполняемый файл сценария

    Разрешает выполнение небезопасных операций. При использовании этой опции в UNIX программа Perl выполняется в незащищенном режиме и ей предоставляется полный доступ к файловой системе

    Отображает номер версии, а также другую важную информацию об интерпретаторе peri

    Отображает информацию конфигурации интерпретатора peri (расположение необходимых библиотек, значения переменных среды и т. д.). Если задано имя переменной среды, отображает ее установленное значение

    Включает режим отображения предупреждений во время компиляции программы Perl. Рекомендуется всегда применять эту опцию

    Извлекает и выполняет сценарий Perl, расположенный в текстовом файле. Эта возможность удобна, если сценарий прислан по электронной почте. Интерпретатор сканирует файл, пока не найдет строку, начинающуюся с символов «# ! » и содержащую слово «peri». После этого выполняется сценарий до лексемы END . Если задан параметр каталог, то перед выполнением сценария он становится текущим

    Как видно из табл. 14.1, интерпретатор peri располагает достаточно большим набором опций, разработанных специально в помощь системному администратору UNIX. Эти опции позволяют решать задачи, даже не прибегая к созданию текстового файла сценария Perl.

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

    Итак, мы хотим в конфигурационных файлах configl, config2 и configS, содержащих строки вида ключ = ЗНАЧЕНИЕ, изменить значение ключа «кеу!» на величину 5. Эта задача решается следующим вызовом peri из командной строки:

    if($l eq V’KeylV)<$_ = \"$1 = 5\n\";>;» configl config2 configS

    Несколько комментариев к строке вызова интерпретатора peri. В ней использованы опции -р и -i для обработки содержимого конфигурационных файлов по месту (опция -i, причем задано расширение .bak для копий исходных файлов) в неявном цикле с печатью] (опция -р). Код модификации содержимого файлов задается с помощью о/щии -е. Он достаточно прост. Строка файла, прочитанная в специальнуюЛтеременную Perl $_, проверяется на содержание подстроки вида ключ = ЗНАЧЕНИЕ. В регулярном выражении определены две группы: первая соответствует ключу, а вторая — его значению. Таким способом мы сохраняем имя ключа и его значение в специальных переменных $1 и $2, соответственно. Второй оператор кода, в случае совпадения имени ключа с заданным, заносит в переменную $_ строку с новым значением ключа (кеу! = 5).

    Как выполняется этот сценарий? Создается копия исходного конфигурационного файла configl (файл configl.bak) и новый пустой файл с именем configl. Последовательно в переменную $_ читаются строки из файла-копии, а в переменную $1 заносится имя ключа, если таковой обнаружен оператором т/. /. Если имя ключа равно «Keyi», то в переменной $_ формируется строка задания нового значения ключа. Перед чтением следующей строки файла configl.bak в файл configl записывается содержимое переменной $_. Эта процедура выполняется со всеми заданными конфигурационными файлами. В результате выполнения этой программы формируются конфигурационные файлы, в которых значение ключа Keyi изменено на 5.

    Опция -р достаточна полезна для анализа содержимого файлов. Например, следующая команда отобразит на экране содержимое файла prog.pl:

    peri -p -е»1″ prog.pl

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

    При работе с интерпретатором из командной строки очень часто используются регулярные выражения для отображения какой-либо части содержимого файла. Следующий вызов peri отображает на экране монитора последний столбец данных из файла test.dat (элементы столбцов в строке файла разделены пробелами):

    Замечание При использовании опции -р следует помнить, что она печатает содержимое специальной переменной $_. Поэтому информацию, подлежащую отображению, следует помещать именно в эту переменную, как в последнем примере.

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

    14.2. Отладчик Perl

    Написав программу и устранив ошибки компиляции, любой программист втайне надеется, что она будет работать именно так, как он и задумывал. Практика, однако, в большинстве случаев совершенно иная: при первом запуске программа работает, но выполняет не совсем, а иногда и совсем не то, что надо; при одних исходных данных она работает идеально, а при других «зависает». И это случается не только с начинающим, но и с опытным программистом. В таких случаях на помощь приходит отладчик — специальная программа, которая позволяет программисту, обычно в интерактивном режиме, предпринять определенные действия в случае возникновения необычного поведения программы.

    Для вызова встроенного отладчика интерпретатора peri его необходимо запустить с опцией -d (задав ее либо в командной строке, либо в строке специального комментария I! самой программы). Отладчик инициируется, когда начинает выполняться сценарий Perl. При этом отображается версия отладчика, первая выполняемая строка кода программы и его приглашение DB на ввод команд пользователя:

    Loading DB routines from perl5db.pl version 1.0402 Emacs support available.

    Enter h or *h h’ for help.

    main::(examplel.pl:3): print «\000\001\002\003\004\005\006\007\n»; DB

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

    Замечание Все, что здесь говорится о встроенном отладчике, относится к пользователям системы UNIX. Тот, кто работает в системах семейства Windows и пользуется интерпретатором peri фирмы ActiveState, может совсем не читать этот раздел, так как интерпретатор этой фирмы снабжен отладчиком, работа с которым осуществляется через графический интерфейс пользователя, а не с помощью командной строки. Хоти ничто не мешает таким пользователям воспользоваться встроенным отладчиком, аналогичным отладчику интерпретатора peri для UNIX, и работать с ним из командной строки. Для этого следует воспользоваться командным файлом cmddb.bat, расположенным в каталоге \perl520\debugger.

    14.2.1. Просмотр текста программы

    При загрузке отладчика отображается первая строка кода программы Perl. Но для выполнения определенных действий (установки точки останова, задания определенных действий при выполнении конкретного оператора Perl и т. д.) нам необходимо видеть текст программы. Как это осуществить? В отладчике для подобных действий предусмотрен ряд команд.

    Команда i отображает на экране монитора 10 строк текста программы, расположенных непосредственно за последней отображенной строкой. Последовательное выполнение этой команды позволяет быстро пролистать текст программы. Вызов команды i с указанием номера строки отобразит ее содержимое. Несколько последовательных строк программы можно увидеть, задав в команде i через дефис номер начальной и конечной строки. Например, команда 1 1-5 отобразит пять строк программы:

    DB 1 1-5 1 #! peri -w

    2==> open FILE, «books» or die $!; 3: open REPORT, «>report»; 4 5: select REPORT;

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

    Команда w отобразит блок, или окно строк — три строки до текущей, текущая строка и шесть после текущей. Текущей в отладчике считается строка программы после последней отображенной. Если команде w передать номер строки, то отобразится окно строк относительно заданной строки текста — три строки до заданной, сама заданная строка и шесть после нее.

    Последняя команда отображения текста программы — команда — (дефис), которая отображает 10 строк текста, предшествующих текущей строке.

    14.2.2. Выполнение кода

    Команда s предназначена для последовательного пошагового выполнения программы: каждый ее вызов выполняет следующую строку кода. Эта строка должна выполняться в программе без изменения потока выполнения операторов. После выполнения очередной строки кода отображается строка, которая должна быть выполнена следующей:

    DB s main: : (exaitple2.pl:3) : @s = split;

    При следующем выполнении команды s будет выполнена отображенная строка программы: @s = split;.

    Если следующая выполняемая строка кода расположена в модуле, код которого доступен (например, вызов подпрограммы), то осуществляется переход в него, соответствующая строка кода выполняется и отладчик приостанавливает выполнение программы до ввода следующей программы. Последующие команды s будут построчно выполнять код подпрограммы, пока не выполнится последняя строка ее кода. Таким образом, команда s позволяет выполнять подпрограмму с заходом в нее.

    Команда п работает аналогично команде s, последовательно выполняя строки кода программы, за одним исключением — она выполняет код подпрограммы без захода в него, т. е. код подпрограммы выполняется полностью, и при следующем вызове команды п выполняется оператор строки кода, непосредственно следующей за строкой с вызовом подпрограммы. Таким образом, команда п позволяет «обойти» пошаговое выполнение операторов подпрограммы.

    Если мы осуществляем пошаговое выполнение программы (командами s или п), то нажатие клавиши эквивалентно вызову последней команды s или п.

    Если мы в процессе отладки попали в тело подпрограммы (после, например, выполнения очередной команды s), то командой г можно немедленно завершить ее выполнение. Выполнение программы приостанавливается на первом после вызова подпрограммы операторе в ожидании очередной команды пользователя. \

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

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

    14.2.3. Просмотр значений переменных

    В процессе отладки можно посмотреть значение любой переменной программы в любой момент времени. Команда

    V [пакет [переменная]]

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

    При работе с этой командой следует иметь в виду, что при задании переменной, значение которой необходимо посмотреть, не надо задавать никакого префикса, а только идентификатор переменной. Отладчик отобразит значения всех переменных указанного пакета с заданным идентификатором. Например, если в программе определена скалярная переменная $ref, маесив скаляров @ref и хеш-массив %ref, то выполнение команды v main ref приведет к следующему результату:

    DB V main ref $ref = 24 @ref = ( 1


    Команда х аналогична команде v, но она отображает значения переменных текущего пакета. Ее параметром является идентификатор переменной, имя пакета указывать не надо. Вызванная без параметров, она отображает значения всех переменных текущего пакета. Например, команда х ref отобразит значения переменной $ref, массива @ref и хеш-массива %ref текущего пакета, внутри которого приостановлено выполнение программы. По умолчанию программа выполняется в пакете main.

    Команда t работает как переключатель, включая режим отображения строк выполняемого кода (режим трассировки) или выключая его:

    main::(example2.pl:3): @ref = (1,2,3,4); main::(example2.pl:4): %ref = («One»,l, «Two»,2); main::(example2.pl:5): $_ = » qwerty \t\tqwerty»;

    DB t Trace = off

    DB с 7 main::(example2.pi:7): mySub();

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

    14.2.4. Точки останова и действия

    В процессе отладки программы возникает необходимость приостановить ее выполнение в определенных подозрительных иестах, посмотреть значения

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

    Для этих целей служит команда ь (сокращение от английского глагола break — прервать) отладчика. Ее параметром является номер строки кода, в которой устанавливается точка останова: отладчик приостановит выполнение программы Perl перед заданной строкой. Если команда ь вызывается без параметра, то точка останова определяется в текущей строке.

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

    I устанавливает точку останова в первой строке кода подпрограммы mySub.

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

    определяет условную точку останова в строке 4. Отладчик приостановит выполнение программы перед этой строкой по команде с только, если значение переменной $г будет равно 1.

    Команда L отображает список всех установленных точек останова, как безусловных, так и условных:

    DB b 4 $г==1 DB b 6 DB L

    Iexample2.pl: . •. -. , 4: %ref = («One». «Two»,2);

    break if ($r==l) 6: @s = split;

    Отображаемая информация о точке останова представляет номер строки и код Perl, а также условие, при котором действует точка останова (break

    if (УСЛОВИЕ)). Для безусловной точки останова условие всегда истинно и равно 1.

    Для удаления точки останова достаточно выполнить команду d с параметром, равным номеру строки, в которой определена точка останова. Команда о удаляет все точки останова, определенные в сеансе работы с отладчиком.

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

    а 75 print «*** $ref\n»;

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

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

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

    Таблица 14.2. Основные команды отладчика

    Компьютерный портал osblog

    Так сложилось, что я знаю как минимум двух человек, которые хотели бы выучить Perl. Специально для них я решил написать этот пост.

    • Часть 1: Типы переменных (вы читаете эту часть)

    В нем вы найдете примеры простых программ из серии «вывести числа от 1 до 5» и тому подобное. Мне всегда нравилось учиться на примерах — это интереснее и быстрее, чем по книжкам или на семинарах. Также можете посмотреть посты этого блога, — велика вероятность, что в них вы найдете еще примеры.

    Я предполагаю, что в школе/институте вы изучали Pascal/Delphi, C или хотя бы Basic, и объяснять, что такое функция и циклы не требуется. Если это не так — ничего страшного, просто для того, чтобы во всем разобраться, вам придется потратить лишнее время на чтение Википедии. Если вы не знаете, как запустить bash-скрипт, или для чего в первой строке скрипта писать что-то вроде #!/bin/sh , придется немного погуглить , чтобы это выяснить.

    Специально для тех, кого интересуют вопросы, «а правда ли, что Perl очень сложен», «а какие книжки по Perl можете посоветовать» и даже «эээ… а что, на нем еще пишут?», я написал Mini-FAQ по Perl , которое вы можете прочитать на HabraHabr. А для тех, кто неасилил многабукв здесь я приведу краткое его содержание:

    • Perl — современный язык программирования, на котором пишут и будут писать еще очень долго.
    • Perl, как и любой другой язык программирования, имеет свои достоинства, недостатки и области применения. Существует действительно большой класс задач, которые Perl решает на 5+.
    • Синтаксис Perl не сложнее синтаксиса C++ или Java. В этом вы сможете убедиться, дочитав данный пост до конца.
    • Существуют хорошие и при этом недорогие учебники по Perl. Также в сети вы без труда найдете сообщество perl-программистов, говорящих на вашем родном языке.
    • Perl хорошо работает как под операционными системами семейства UNIX, так и под Злом Windows.

    Дополнение: Также я рекомендую вам ознакомиться со статьями Perl vs Python vs Ruby vs PHP и Жрецы программирования . Первая повествует о производительности различных скриптовых языков, вторая — об отличии PHP от других ЯП. Фанатам Пайтона советую прочитать заметку Тест производительности скриптов на Python . Надеюсь, что эти материалы помогут вам найти ответ на вопрос «чем хорош Perl».

    Привет, %username%!

    Итак, давайте уже напишем наш первый скрипт на Perl!

    $name = shift () ;
    print («Hello, $name! \n » ) ;

    $ chmod u+x 1 .pl
    $ ./ 1 .pl afiskon
    Hello, afiskon!

    Тут все очень просто:

    • Имена скалярных переменных (то есть не массивов и не хэшей, что это такое — см ниже) начинаются со знака доллара.
    • Функция shift возвращает очередной аргумент скрипта. Другими словами первый вызов shift() возвращает первый аргумент, второй вызов — второй аргумент и так далее.
    • Функция print() выводит строку, переданную в качестве аргумента.
    • В строку можно подставлять значения переменных (см строку 4). Подробнее о строках — см далее.

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

    Типы переменных

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

    Скаляры мы уже использовали в предыдущем примере. Вот еще несколько примеров задания скаляров.

    $a = 123 ;
    $b = — 7.496 ;
    $c = 0xABC; # равно 2748, да, это комментарий:)
    $d = ($a + $b ) / $c ;
    $d *= $a ; # тоже самое, что $d = $d * $a;

    $str1 = «hello» ;
    $str2 = «$str1, world» ; # в $str2 записано «hello, world»
    $str3 = $a . » \n » . $str2 ;
    $str4 = «$str1» ; # в $str4 записано «$str1», а не «hello»

    Тут мы задаем положительные и отрицательные, целые и дробные числа, задаем число в шестнадцатеричной кодировке, складываем, умножаем и делим — все как в Си или Java. Кроме перечисленных операций Perl также поддерживает операцию возведения в степень:

    $a = 2 ** 8 ; # результат: 256

    Со строками все примерно так же, как в каком-нибудь PHP. Точка означает операцию конкатенации (то есть «склеивания» строк), если в строке содержатся имена переменных, на их место подставляются значения, с помощью обратного слэша можно вставлять символы новой строки (\n), табуляции (\t), кавычки (\»), сам обратный слэш (\\) знак доллара безо всякой подстановки переменных (\$) и многое другое. Если строка в одинарных кавычках, символы в ней трактуются «как есть», без подстановки переменных и тд.

    Как и PHP, Perl интерпретирует скаляры, как числа или как строки в зависимости от операции. Все просто:

    $int1 = «11» + 22 ;
    # ^ строка «11» преобразуется в число,
    # после чего выполняется сложение, результат: 33.
    $str1 = «11» . 22 ;
    # ^ число 22 преобразуется в строку,
    # после чего выполняется конкатенация, результат: «1122».

    Правила преобразования из строки в число и наоборот тут те же, что и в PHP:

    $str1 = 0 . «abc» ;
    # ^ результат — «abc», число ноль преобразуется в пустую строку
    $int1 = «aaa» + 1 ;
    # ^ результат — 1, в строке «aaa» нет цифр
    $int2 = «12aaa» + 1 ;
    # ^ результат — 13, учитываются только первые цифры строки

    Кстати, для объявления длинных строк существуют специальные операторы — q и qq:

    # аналогично одинарным кавычкам
    $text = q <
    Do you have $15 ?
    > ;
    # аналогично двойным кавычкам
    $message = qq <
    Hello, $username !
    How are you?
    > ;

    Работа с массивами происходит следующим образом:

    $scalar = «bebebebe» ;
    ($a , $b ) = (1 , 2 ) ; # тоже самое, что $a = 1; $b = 2;
    @arr = («aaa» , 123 , $scalar , $a + $b ) ;
    print $arr [ 1 ] . » \n » ;
    push @arr , $a ;
    print pop (@arr ) . » \n » ;

    Здесь мы создаем массив @arr, состоящий из 4-х элементов (строка 5). Затем выводим второй элемент (строка 6). Нумерация элементов начинается с нуля, поэтому для вывода второго по счету элемента используется индекс 1. Затем кладем в конец массива значение переменной $a (функция push, строка 7), и тут же извлекаем и выводим его (функция pop, строка 8).

    Обратите внимание, имена массивов начинаются с «собаки», а не доллара (запомнить не сложно — соответствующие символы похожи на первые буквы английских названий типов: $ — scalar, @ — array). При обращении ко второму элементу массива (строка 6) использовался знак доллара, потому что элемент массива является скаляром. По началу это вызывает много путаницы, но вообще все логично.

    Еще в этом скрипте мы вызываем функции print и push без скобок. В Perl при вызове функции, везде, где это не вызывает неопределенности, скобки можно опустить.

    Для объявления массива, элементами которого являются строки без пробелов, существует специальный оператор — qw:

    @arr = qw/aaa bbb ccc/ ;
    # аналогично («aaa», «bbb», «ccc»), только короче

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

    Мастер Йода рекомендует:  Опыт использования Vue.js в «Едадиле» как применяют и почему не выбрали React

    %hash = ( # при объявлении хэшей и массивов можно
    «x» => 12 , # использовать перенос строк
    y => 53 , # если в ключе нет спец-символов, кавычки не нужны
    «z» => — 10.5 , # запятую на конце можно оставлять
    ) ;

    $hash < "x" >++; # координата по x теперь равна 13
    $hash < y >—; # координата по y теперь равна 52

    # выводим координаты
    print «x = $hash, y = $hash, z = $hash\n » ;

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

    Кстати, переменные $test, @test и %test — это совершенно независимые друг от друга переменные разного типа.

    В этом месте я хотел перейти к условным операторам и циклам for/while, но понял, что для одного поста текста и так уже многовато. Между тем за кадром остались многие вопросы:

    • Условные операторы;
    • Циклы for и while;
    • Объявление функций;
    • Работа с потоками и файлами;
    • Строгий синтаксис;
    • Использование готовых модулей и классов.

    Об этом я напишу в одной из следующих заметок. Хотелось бы получить хотя бы парочку комментариев на этот пост — интересно/неинтересно, понятно/непонятно и так далее. Кстати, если у вас есть вопросы, связанные с Perl (не обязательно с этим постом) — смело задавайте их в комментариях!

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

    Что такое Perl?

    Perl является интерпретируемым языком, созданным программистом Лари Уоллом (Larry Wall) для обработки больших текстов и файлов и расшифровывается, как Practical Extraction and Report Language (язык для практического извлечения данных и составления отчетов). С помощью Perl вы, например, можете создать скрипт, который открывает один или несколько файлов, обрабатывает информацию и записывает результаты.

    С изобретением World Wide Web, Perl оказался прекрасным средством для взаимодействия с web-серверами через Common Gateway Interface (CGI) — общий интерфейс взаимодействия. Команды Perl могут легко получить данные из формы HTML или другого источника и что-нибудь с ними сделать.


    Как Perl обрабатывает данные из форм

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

    • добавить их в текстовый файл,
    • ввести их в базу данных,
    • вставить их в электронное письмо,
    • добавить их в существующую web-страницу,
    • создать новую web-страницу,
    • отобразить их в окне браузера.

    Некоторые из этих примеров рассматриваются в нашем уроке.

    Как генерируются web-страницы «на лету»

    Больше всего впечатляет то, что Perl может быть использован для создания web-страниц «на лету» в ответ на запрос или действие пользователя. Новая страница может быть

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

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

    В чем различие между программой и скриптом?

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

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

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

    Альтернативы Perl

    Существует несколько альтернатив использованию Perl:

    • С, Visual Basic — более традиционные компьютерные языки для обработки вводимых данных. Должны компилироваться под определенную платформу.
    • ActiveX — включение программных компонент, выполняющихся в браузере.
    • JavaScript, VBScript — обеспечивают некоторую интерактивность HTML страниц, которую HTML обеспечить не может.
    • Cold Fusion — сторонняя программа для связи форм с базами данных.
    • PHP/FI — еще одна сторонняя программа для связи форм с базами данных.

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

    Что вам требуется, чтобы запустить Perl

    Для запуска Perl вашей системе понадобится несколько компонент:

    1. Скрипт, написанный вами или предложенный вам другим, сохраненный в текстовом файле.
    2. Perl интерпретатор. Любой Perl скрипт в первой строке содержит путь к этой программе.
    3. Web-страница с которой будет запускаться этот скрипт. Она может содержать форму или просто ссылку, если скрипт не требует входных данных.
    4. Web-сервер. Взаимодействие между web-страницей и скриптом производится сервером. Поэтому вы должны иметь доступ к web-серверу с возможностью записи и запуска на нем скриптов.

    Где взять Perl

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

    • Общая информация о Perl — https://www.perl.com/perl/index.html
    • Perl для UNIX — https://www.perl.com/perl/info/software.html
    • Perl для Win32 — https://ntperl.hip.com

    Этапы создания скрипта

    После того, как вы установили на своем компьютере необходимое ПО, нужно совершить несколько шагов для запуска Perl на вашем узле:

    1. Создать форму для вызова скрипта.
    2. Создать сам скрипт.
    3. Отладить скрипт. Проверить отсутствие ошибок (если это возможно, лучше проверить все возможные пути выполнения программы).
    4. Поместить скрипт на сервер и не забыть дать ему права на выполнение.
    5. Связать скрипт с формой, вставив его имя в параметр action тэга form. Например:

    Записки программиста

    Наконец-то освоил Perl’овый отладчик

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

    Запускается отладчик очень просто:

    Кроме того, вы можете получить REPL-среду, выполнив команду:

    Раньше для этих целей я использовал модуль Devel::REPL, который, в общем-то, всем хорош, если не считать зависимость от Moose и то, что некоторые другие его зависимости приходится подтягивать вручную.

    Итак, отладчик мы запустили. Теперь рассмотрим доступные нам команды.

    Прочитать код, начиная с определенной строчки, объявления процедуры или находящийся в диапазоне некоторых строк:

    Посмотреть предыдущие относительно текущей позиции строки кода:

    Посмотреть код в окрестностях текущей позиции или указанной строки, как перед, так и после нее:

    Выполнить некую команду и просмотреть результат в $PAGER:

    Поиск по регулярному выражению re в прямом направлении (если re не указан, продолжить предыдущий поиск):

    По аналогии — поиск в обратном направлении:

    Загрузить для просмотра заданный файл:

    Вернуть просмотр кода на текущую позицию:

    Показать все доступные методы класса:

    Показать список всех загруженных модулей:

    Показать список всех доступных подпрограмм:

    Вычислить некое Perl-выражение и вывести результат:

    Также в отладчике можно модифицировать значения переменных отлаживаемого скрипта:

    Perl и CGI: практическое руководство

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

    Итак, коснемся процесса получения данных,
    вводимых юзером через веб-форму. Существуют
    два способа передачи этих самых параметром.
    Начну я с метода POST. Как ты понимаешь, у
    каждой веб-формы есть поля, куда чел
    вписывает свои значения. Для примера,
    возьмем простейшую форму:

    Здесь присутствует лишь одно такое поле с
    именем COLOR. При просмотре через браузер чел
    видит стандартное текстовое поле с
    возможностью ввода. Предположим, что наш
    подопытный юзер ввел «BLACK». При нажатии
    на кнопку SUBMIT скрипту с именем pingwin.pl
    передается запрос вида параметр=значение,
    где «параметр» это имя поля формы, а
    значение это значение, которое было
    присвоено данному параметру, т.е. в нашем
    случае это будет COLOR=BLACK. Однако, в Перле нет
    встроенной поддержки обработки параметров,
    принятых через CGI и нам придется писать код,
    чтобы потом можно было пользоваться этими
    значениями. Получилось что-то вроде этого:

    @pairs = split(/&/,$buffer);
    foreach $pair(@pairs) <
    ($name, $value) = split(/=/,$pair);
    $value =

    Это дало нам хеш вида

    %FORM qw(
    параметр1 значение1
    параметр2 значение2

    параметрN значениеN );

    Теперь мы можем получать значение
    определенного параметра, юзая стандартный
    для хеша синтаксис — $FORM<'параметр'>. В нашем
    случае $FORM <'COLOR'>дает результат «BLACK».
    Если тебе лень гимориться с этими хешами в
    процессе написания скрипта, то можешь для
    простоты работы в начале проги присвоить
    обычным переменным значения хеша. Например,

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

    Теперь разберем метод GET. Отличия его от POST
    не такие уж и большие, а с точки зрения юзера
    вообще незаметны. Заключаются он в передачи
    параметров и значений. В отличие от POST, они
    передаются в строке вызова скрипта. Для
    примера опять будем юзать форму про
    пингвина и цвета. Когда юзверь нажимает
    кнопу SUBMIT, браузер делает запрос к скрипту
    вида https://perl-cool.org/cgi-bin/pingwin.pl? параметр1=значение1&параметр2=значение2&параметрN=значениеN.
    В нашем примере это будет https://perl-cool.org/cgi-bin/pingwin.pl?COLOR=BLACK
    . Зная это, можно самому, без формы
    обращаться к скрипту, указывая параметры и
    значения в адресной строке своего браузера.
    Очень полезно, когда требуется создать
    ссылку на скрипт с определенными
    параметрами. Но из-за этой особенности
    меняется и код опознания параметров. Он
    имеет следующий вид:

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

    Для начала надо сообщить этому самому
    браузеру, что далее следует HTML-документ. Для
    этого используем стандартный вывод:

    print «Content-type: text/html\n\n»;

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

    Теперь ты можешь выводить весь HTML,
    используй всё тот же стандартный метод
    вывода оператора print, но этот способ
    является ОЧЕНЬ неудобным. Намного удобнее
    делать это, используя так называемый here-документ.
    Выглядит он так:

    Print 31337 Example \n»;
    print » Типа здесь будет текст…\n»;
    print »
    А теперь строчкой ниже…\ \n»;
    print «

    Как устранить мой Perl CGI скрипт?

    У меня есть сценарий Perl, который не работает, и я не знаю, как начать сужать проблему. Что я могу сделать?

    Примечание: Я добавляю вопрос, потому что я действительно хочу, чтобы добавить свой самый длинный ответ на Stackoverflow. Я держу внешне ссылки на него в других ответах и ​​заслуживает того, чтобы быть здесь. Не стесняйтесь редактировать свой ответ, если у вас есть что-то добавить.

    Этот ответ предназначен в качестве общей основы для работы через проблемы с CGI скриптов Perl и первоначально появились на Perlmonks , как и устранение неисправностей Perl CGI скриптов . Это не полное руководство по каждой проблеме, вы можете столкнуться, ни учебник по ошибке деформируя. Это просто кульминация моего опыта сценариев отладки CGI десять (плюс!) Лет. Эта страница , кажется, было много разных домов, и я , кажется, забывают , что существует, поэтому я добавляю его в StackOverflow. Вы можете отправить любые комментарии или пожелания по bdfoy@cpan.org. Это также сообщество вики, но не переборщите орехи. 🙂

    Используете ли вы в Perl встроенных функций, чтобы помочь вам найти проблемы?

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

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

    Если вам нужно больше информации , чем короткое предупреждающее сообщение, используйте diagnostics прагму , чтобы получить больше информации, или посмотреть в perldiag документации:

    Возможно, вы имели выходной действительный CGI заголовок первого?

    Сервер ожидает первый выход из сценария CGI , чтобы быть заголовок CGI. Как правило , это может быть так просто , как print «Content-type: text/plain\n\n»; и с CGI.pm и его производных, print header() . Некоторые сервера чувствительны к ошибкам вывода (на STDERR ) , показывающих перед стандартным выводом (на STDOUT ).

    Попробуйте отправить ошибки в браузере

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

    Что сказать, журнал ошибок?


    Серверы держать журналы ошибок (или они должны, по крайней мере). Выход ошибки с сервера и из вашего сценария должен появиться там. Найти журнал ошибок и посмотреть , что он говорит. Существует не стандартное место для файлов журналов. Посмотрите в конфигурации сервера для их размещения, или попросите администратора сервера. Вы можете также использовать инструменты , такие как C :: Ca , чтобы сохранить ваши собственные файлы журналы.

    Какие разрешения сценария?

    Если вы видите ошибки , такие как «Отказано в доступе» или «метод не реализован», это , вероятно , означает , что ваш сценарий не может быть прочитан и исполняемым пользователем веб — сервера. На разновидностях Unix, изменить режим 755 рекомендуется: chmod 755 filename . Никогда не устанавливайте режим в 777!

    Используете ли вы use strict ?

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

    компилировать ли сценарий?

    Вы можете проверить на наличие ошибок компиляции с помощью -c переключателя. Сконцентрируйтесь на первые ошибки сообщили. Промыть, повторите. Если вы получаете действительно странные ошибки, убедитесь , что ваш сценарий имеет правильные окончания строк. Если FTP в двоичном режиме, извлечение из CVS, или что — то другое , что не обрабатывает конец строки перевода, веб — сервер может увидеть ваш сценарий как один большой линии. Передача скриптов Perl в режиме ASCII.

    Является ли сценарий жалуясь небезопасными зависимостями?

    Если ваш скрипт жалуется на ненадежных зависимости, вы, вероятно , с помощью -T переключателя , чтобы включить режим меченого, который является хорошей вещью , так как он держит вас передавая непроверенные данные в оболочку. Если жалуясь он делает свою работу , чтобы помочь нам написать более безопасные сценарии. Любые данные , исходящие из внешней программы (т.е. среды) считаются испорченными. Переменные окружения , такие как PATH и LD_LIBRARY_PATH особенно нежелательны. Вы должны установить их в безопасное значение или убрать их полностью, как я рекомендую. Вы должны использовать абсолютные пути в любом случае. Если проверка порчи жалуется на что — то другое, убедитесь , что у вас есть незапятнанные данные. См perlsec для уточнения деталей.

    Что происходит, когда вы запустите его из командной строки?

    Вывод сценария , что вы ожидаете ли при запуске из командной строки? Является ли выход заголовка первого, а затем пустая строка? Помните , что STDERR могут быть объединены с , STDOUT если вы находитесь на терминале (например , интерактивная сессия), и из — за буферизации может отображаться в случайном порядке. Включите функцию AutoFlush Perl, установив $| к истинному значению. Как правило , вы можете увидеть $|++; в программах CGI. После установки, каждая печать и запись будет сразу перейти к выходу , а не буфер. Вы должны установить это для каждого дескриптора. Используйте , select чтобы изменить дескриптор файла по умолчанию, например , так:

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

    Что происходит, когда вы запустите его из командной строки с CGI-средой?

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

    Отозвать или удалить эти переменные

    • PATH
    • LD_LIBRARY_PATH
    • все ORACLE_* переменные

    Установите эти переменные

    • REQUEST_METHOD (установлен GET , HEAD или POST в зависимости от обстоятельств)
    • SERVER_PORT (Устанавливается равным 80, как правило)
    • REMOTE_USER (Если вы делаете защищенный материал доступа)

    Последние версии CGI.pm (> 2,75) требуют -debug флаг , чтобы получить старый (полезный) поведение, так что вы , возможно , придется добавить их к CGI.pm импорту.

    Используете ли вы die() или warn ?

    Эти функции печати , STDERR если вы не пересмотрели их. Они не выводит заголовок CGI, либо. Вы можете получить ту же функциональность с пакетами , такими как CGI :: Carp

    Что происходит после того, как вы очистить кэш браузера?

    Если вы думаете, что ваш скрипт делает правильно, и при выполнении запроса вручную, вы получите правильный выход, браузер может быть виновником. Очистить кэш и установить размер кэша до нуля во время тестирования. Помните, что некоторые браузеры действительно глупы и не будет на самом деле перезагрузить новое содержание, даже если вы скажете ей сделать это. Это особенно распространено в тех случаях, когда URL путь тот же, но изменения содержания (например, динамические изображения).

    Есть сценарий, где вы думаете, что это?

    Путь файловой системы к сценарию не обязательно напрямую связана с URL-путь к сценарию. Убедитесь, что у вас есть правильный каталог, даже если у вас есть, чтобы написать короткий тестовый скрипт, чтобы проверить это. Кроме того, вы уверены, что вы изменяете нужный файл? Если вы не видите никакого эффекта с вашими изменениями, вы можете быть изменения в другой файл, или загрузить файл в неправильном месте. (Это, кстати, моя самая частая причина таких неприятностей;)

    Используете ли Вы CGI.pm , или производные от него?

    Если ваша проблема связана с разбором ввода CGI , и вы не используете широко испытанный модуль , как CGI.pm , CGI::Request , CGI::Simple или CGI::Lite , использовать модуль и получить от жизни. CGI.pm имеет cgi-lib.pl режим совместимости , который может помочь вам решить входные проблемы из — за старые реализации парсера CGI.

    Использовали ли вы абсолютные пути?

    Если вы работаете с внешними командами system , обратно клещами или другими IPC средства, вы должны использовать абсолютный путь к внешней программе. Мало того, что вы точно знаете , что вы работаете, но вам избежать некоторых проблем безопасности , а также. Если вы открываете файлы для любого чтения или записи, использовать абсолютный путь. Сценарий CGI может иметь различное представление о текущем каталоге , чем вы. Кроме того , вы можете сделать явное , chdir() чтобы поставить вас в нужном месте.

    Вы проверить возвращаемые значения?

    Большинство функций Perl сообщит вам , если они работали или нет , и будет установлен $! на провал. Проверили ли вы возвращаемое значение и проверьте $! наличие сообщений об ошибках? Проверили ли вы , $@ если вы используете eval ?

    Какую версию Perl вы используете?

    Последняя стабильная версия Perl является 5.16.2. Вы используете старую версию? Различные версии Perl могут иметь разные представления предупреждений.

    Какой сервер веб вы используете?

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

    Вы проверили документацию сервера?

    Серьезные CGI программисты должны знать, как много о сервере, как это возможно — в том числе не только серверных функций и поведения, но также и в локальной конфигурации. Документация для сервера не может быть доступна для вас, если вы используете коммерческий продукт. В противном случае, документация должна быть на вашем сервере. Если это не так, искать его в Интернете.

    Вы поиск в архиве comp.infosystems.www.authoring.cgi ?

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

    Вы можете воспроизвести проблему с коротким тестовым скриптом?

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

    Вы решили пойти в кино?

    Шутки в сторону. Иногда мы можем получить так завернутый в проблему, что мы развиваем «воспринимаемое сужению» (туннельное зрение). Сделав паузу, получить чашку кофе, или взрывных некоторых плохих парней в [Duke Nukem, Quake, Doom, Halo, COD] может дать вам свежий взгляд, что вам нужно заново подойти к решению проблемы.

    Вы вокализация проблемы?

    Серьезно снова. Иногда объясняя проблему вслух приводит нас к нашим собственным ответам. Поговорите с пингвина (плюшевая игрушка) , потому что ваши сотрудники не слушают. Если вы заинтересованы в этом , как серьезный инструмент отладки (и я рекомендую, если вы не нашли проблему, сейчас), вы могли бы также прочитать Психология компьютерного программирования .

    Я думаю , CGI :: Debug стоит упомянуть также.

    Интересно , как же никто не упомянул PERLDB_OPTS вариант называется RemotePort ; хотя по общему признанию, здесь не так много рабочих примеров в Интернете ( RemotePort даже не упоминается в perldebug ) — и это было своего рода проблематично для меня , чтобы придумать с этим, но здесь идет (это являющийся примером Linux).

    Для того, чтобы сделать правильный пример, первый мне нужно было что — то , что может сделать очень простую имитацию CGI веб — сервера, предпочтительно через одну командную строку. После нахождения простого веб — сервера из командной строки для запуска CGI скрипты. (perlmonks.org) , я нашел IO :: All — крохотный веб — сервер , чтобы быть применимо для этого теста.

    Здесь, я буду работать в /tmp директории; скрипт CGI будет /tmp/test.pl (приведен ниже). Обратите внимание , что IO::All сервер будет обслуживать только исполняемые файлы в том же каталоге, что и CGI, поэтому chmod +x test.pl здесь требуется. Таким образом, чтобы сделать обычный тест CGI бежать, изменить директорию на /tmp в терминале, и запустить веб — сервер , один-лайнер есть:

    Команда веб — сервер будет блокировать в терминале, и в противном случае запустить веб — сервер локально (на 127.0.0.1 или localhost ) — после этого, я могу пойти в веб — браузере, и запросить этот адрес:

    . и я должен соблюдать print S , сделанные test.pl загружаемой — и показал — в веб — браузере.

    Теперь, чтобы отладить этот скрипт с RemotePort , сначала нужен слушатель в сети, через которую мы будем взаимодействовать с отладчиком Perl; мы можем использовать инструмент командной строки netcat ( nc увидел , что здесь: Perl如何удаленной отладки? ). Таким образом, первым запустить netcat слушателя в одном терминале — где он будет блокировать и ждать соединения на порт 7234 (который будет нашим отладочный порт):

    Затем, мы хотим , perl чтобы начать в режиме отладки с RemotePort , когда test.pl был вызван (даже в режиме CGI, через сервер). Это, в Linux, можно сделать с помощью следующего «притона обертки» сценария — который здесь также должен быть /tmp и должно быть исполняемыми:

    Это своего рода сложная вещь — увидеть скрипт — Как я могу использовать переменные окружения в моем притон? — Unix и Linux Стек Обмен . Но хитрость здесь , кажется, не раскошелиться на perl интерпретатор , который обрабатывает test.pl — так , как только мы попали, мы не exec , но вместо этого мы называем perl «ясно», и в основном «источник» наш test.pl скрипт с помощью do (см Как запустить сценарий Perl из сценария Perl? ).

    Теперь, когда мы имеем perldbgcall.sh в /tmp — мы можем изменить test.pl файл, так что он относится к этому исполняемому файлу на его притон линии (вместо обычного интерпретатора Perl) — здесь /tmp/test.pl измененном следующим образом:

    Теперь, как test.pl и его новый обработчик притон, perldbgcall.sh , в /tmp ; и мы nc прослушиваем отладки соединений на порт 7234 — таким образом , мы можем , наконец , открыть другое окно терминала, перейдите в директорию /tmp , и запустить один-лайнер веб — сервер (который будет прослушивать веб — соединения на порт 8080) есть:

    После того, как это будет сделано, мы можем перейти на наш веб — браузер, и запросить тот же адрес, https://127.0.0.1:8080/test.pl . Однако теперь , когда веб — сервер пытается выполнить сценарий, он будет делать это через perldbgcall.sh хижину — которая начнется perl в режиме удаленного отладчика. Таким образом, выполнение скрипта будет приостановлено — и поэтому веб — браузер будет блокировать, ожидая данных. Теперь мы можем перейти к netcat терминалу, и мы должны увидеть знакомый Perl отладчик текст — однако, выход через nc :

    Как фрагмент кода показывает, мы теперь в основном используют nc как «терминал» — таким образом , мы можем ввести r (и Enter) для «запуска» — и сценарий будет работать до делать точки останова заявление (см также в Perl, в чем разница между $ DB :: сингл = 1 и 2? ), прежде чем снова остановить (примечание в тот момент, браузер будет по- прежнему блокировки).

    Итак, теперь мы можем, скажем, шаг до конца test.pl , через nc терминал:

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

    . делает браузер стоп замка — и , наконец , отображает (полный) вывод test.pl :

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

    Ну, надеюсь , что это поможет кому — то — я уверен , что любил бы наткнулись на это, вместо того , чтобы писать его сам 🙂
    Ура!

    Как я могу устранить свой скрипт CGI Perl?

    У меня скрипт Perl, который не работает, и я не знаю, как начать сужение проблемы. Что я могу сделать?

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

    Используете ли вы обработчик ошибок во время отладки?

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

    Один из способов сделать это — позвонить

    в верхней части вашего скрипта. В этом вызове будет установлен обработчик $SIG <__DIE__>(см. perlvar ), отображающий фатальные ошибки в вашем браузере, при необходимости добавив к нему допустимый заголовок. Другой отладочный трюк CGI, который я использовал до того, как я когда-либо слышал о CGI::Carp заключался в том, чтобы использовать eval с объектами DATA и __END__ на скрипте, чтобы поймать ошибки во время компиляции:

    Этот более подробный метод имеет небольшое преимущество перед CGI::Carp в том, что он будет ловить больше ошибок во время компиляции.

    Мастер Йода рекомендует:  Типичные ошибки сайтов

    Обновление: я никогда не использовал его, но похоже, что CGI::Debug , как предложил Mikael S, также очень полезный и настраиваемый инструмент для этой цели.

    Я думаю, что CGI::Debug тоже стоит упомянуть.

    Интересно, почему никто не упоминал опцию RemotePort под названием RemotePort ; хотя, по общему признанию, в Интернете мало рабочих примеров ( RemotePort даже не упоминается в perldebug ) — и для меня было проблематично придумать этот perldebug , но здесь он идет (это пример Linux).

    Чтобы сделать правильный пример, сначала мне нужно было что-то, что могло бы сделать очень простое моделирование веб-сервера CGI, желательно через одну командную строку. После поиска Simple web-сервера командной строки для запуска cgis. (perlmonks.org) , я нашел для этого теста IO :: All — Tiny Web Server .

    Здесь я буду работать в каталоге /tmp ; сценарий CGI будет /tmp/test.pl (см. ниже). Обратите внимание, что сервер IO::All будет обслуживать только исполняемые файлы в том же каталоге, что и CGI, поэтому здесь требуется chmod +x test.pl Итак, чтобы выполнить обычный пробный запуск CGI, я меняю каталог на /tmp в терминале и запускаю там однострочный веб-сервер:

    Команда webserver будет блокироваться в терминале и в противном случае будет запускать веб-сервер локально (на 127.0.0.1 или localhost ) — впоследствии я могу перейти в веб-браузер и запросить этот адрес:


    . и я должен следить за print сделанной test.pl , загруженной — и отображаемой — в веб-браузере.

    Теперь, чтобы отладить этот сценарий с помощью RemotePort , сначала нам нужен прослушиватель в сети, через который мы будем взаимодействовать с отладчиком Perl; мы можем использовать инструмент командной строки netcat ( nc , увиденный здесь: Perl 如何 удаленная отладка? ). Итак, сначала запустите прослушиватель netcat в одном терминале, где он будет блокировать и ждать соединений на порту 7234 (который будет нашим портом отладки):

    Затем нам нужно, чтобы perl запускался в режиме отладки с помощью RemotePort , когда был вызван test.pl (даже в режиме CGI, через сервер). Это, в Linux, можно сделать, используя следующий сценарий «shebang wrapper», который также должен быть в /tmp , и должен быть выполнен как исполняемый файл:

    Это своего рода сложная вещь — см. Сценарий оболочки. Как я могу использовать переменные среды в моем shebang? — Unix и Linux Stack Exchange . Но трюк здесь, похоже, не в том, чтобы test.pl интерпретатор perl который обрабатывает test.pl — поэтому, как только мы его test.pl , мы не выполняем, но вместо этого мы называем perl «прямо» и в основном «источником» нашего test.pl script using do (см. Как запустить скрипт Perl из скрипта Perl? ).

    Теперь, когда у нас есть perldbgcall.sh in /tmp — мы можем изменить файл test.pl , так что он ссылается на этот исполняемый файл на своей строке shebang (вместо обычного интерпретатора Perl) — здесь /tmp/test.pl изменен таким образом:

    Теперь и test.pl и его новый обработчик shebang, perldbgcall.sh , находятся в /tmp ; и у нас есть nc слушая отладочные соединения на порту 7234, — поэтому мы можем, наконец, открыть другое окно терминала, сменить каталог на /tmp и запустить однострочный веб-сервер (который будет прослушивать веб-соединения на порту 8080):

    После этого мы можем перейти в наш веб-браузер и запросить тот же адрес, https://127.0.0.1:8080/test.pl . Однако теперь, когда веб-сервер пытается выполнить скрипт, он сделает это через perldbgcall.sh shebang — который запустит perl в режиме удаленного отладчика. Таким образом, выполнение скрипта приостанавливается — и поэтому веб-браузер блокируется, ожидая данных. Теперь мы можем переключиться на терминал netcat , и мы должны увидеть знакомый текст отладчика Perl, однако вывод через nc :

    Как показывает фрагмент, мы теперь в основном используем nc как «терминал», поэтому мы можем ввести r (и Enter) для «run» — и скрипт будет запускаться в оператор breakpoint (см. Также In perl, в чем разница между $ DB :: single = 1 и 2? ), прежде чем снова остановиться (обратите внимание, что в этот момент браузер все равно заблокируется).

    Итак, теперь мы можем, скажем, пройти через остальную часть test.pl через терминал nc :

    . однако, и в этот момент браузер блокирует и ждет данных. Только после выхода из отладчика с q :

    . блокирует блокировку браузера и, наконец, отображает (полный) вывод test.pl :

    Конечно, такой отладочный процесс можно сделать даже без запуска веб-сервера — однако, здесь есть что-то особенное: мы вообще не трогаем веб-сервер; мы запускаем выполнение «изначально» (для CGI) из веб-браузера — и единственным изменением, необходимым для самого скрипта CGI, является изменение shebang (и, конечно же, наличие скрипта оболочки shebang в качестве исполняемого файла в том же каталог).

    Ну, надеюсь, это поможет кому-то — я бы наверняка любил бы наткнуться на это, вместо того, чтобы писать сам 🙂
    Ура!

    Для меня я использую log4perl . Это очень полезно и легко.

    Честно говоря, вы можете сделать все самое интересное над этим сообщением. ПОТОМУ ЧТО, самое простое и наиболее проактивное решение, которое я нашел, это просто «распечатать».

    В примере: (обычный код)

    Чтобы узнать, делает ли он то, что я действительно хочу сделать: (Устранение неполадок)

    Этот ответ предназначен как общая структура для работы с проблемами с Perl CGI-сценариями и первоначально появилась на Perlmonks как « Устранение неполадок Perl CGI Scripts» . Это не полное руководство по каждой проблеме, с которой вы можете столкнуться, ни учебник по раздаче ошибок. Это всего лишь завершение моего опыта отладки сценариев CGI за десять (плюс!) Лет. На этой странице было много разных домов, и я, кажется, забыл, что это существует, поэтому я добавляю его в . Вы можете отправить мне любые комментарии или предложения по адресу [email protected] Это также вики-сообщества, но не стоит чересчур гадать. 🙂

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

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

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

    Если вам нужна дополнительная информация, чем короткое предупреждающее сообщение, используйте прагму diagnostics для получения дополнительной информации или посмотрите в документации perldiag :

    Вы сначала вывели действительный заголовок CGI?

    Сервер ожидает, что первый вывод из CGI-скрипта будет заголовком CGI. Обычно это может быть так же просто, как print «Content-type: text/plain\n\n»; или с CGI.pm и его производными, print header() . Некоторые серверы чувствительны к выходу ошибок (на STDERR ), которые отображаются до стандартного вывода (на STDOUT ).

    Попробуйте отправить ошибки в браузер

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

    Что сказал журнал ошибок?

    Серверы хранят журналы ошибок (или они должны, по крайней мере). Ошибка вывода с сервера и из вашего сценария должна появиться там. Найдите журнал ошибок и посмотрите, что он говорит. Не существует стандартного места для файлов журналов. Просмотрите конфигурацию сервера для своего местоположения или спросите администратора сервера. Вы также можете использовать такие инструменты, как CGI::Carp чтобы сохранить свои собственные файлы журналов.

    Каковы разрешения сценария?

    Если вы видите ошибки, такие как «Permission denied» или «Метод не реализован», это, вероятно, означает, что ваш скрипт не читается и не выполняется пользователем веб-сервера. По вкусам Unix рекомендуется изменить режим до 755: chmod 755 filename . Никогда не устанавливайте режим на 777!

    Используете ли вы use strict ?

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

    Скомпилирует сценарий?

    Вы можете проверить ошибки компиляции с помощью ключа -c . Сосредоточьтесь на первых сообщенных ошибках. Прополощите, повторите. Если вы получаете действительно странные ошибки, убедитесь, что ваш скрипт имеет правильные окончания строки. Если вы используете FTP в двоичном режиме, checkout из CVS или что-то еще, что не обрабатывает перевод строки, веб-сервер может видеть ваш сценарий как одну большую строку. Перенос Perl-скриптов в режиме ASCII.

    Является ли сценарий жалоб на небезопасные зависимости?

    Если ваш сценарий жалуется на небезопасные зависимости, вы, вероятно, используете ключ -T чтобы включить taint-режим, что хорошо, поскольку он позволяет вам передавать неконтролируемые данные в оболочку. Если он жалуется, он выполняет свою работу, чтобы помочь нам написать более безопасные сценарии. Любые данные, происходящие извне программы (т. Е. Среда), считаются испорченными. Переменные среды, такие как PATH и LD_LIBRARY_PATH являются особенно сложными. Вы должны установить их в безопасное значение или полностью отключить их, как я рекомендую. В любом случае, вы должны использовать абсолютные пути. Если проверка жалобы жалуется на что-то еще, убедитесь, что вы не очистили данные. Подробнее см. Страницу man perlsec .

    Что происходит, когда вы запускаете его из командной строки?

    Выводит ли сценарий то, что вы ожидаете при запуске из командной строки? Первый вывод заголовка, за которым следует пустая строка? Помните, что STDERR может быть объединен с STDOUT если вы находитесь на терминале (например, в интерактивном сеансе), и из-за буферизации может появиться в беспорядочном порядке. Включите функцию автозапуска Perl, установив $| к истинному значению. Обычно вы можете увидеть $|++; в программах CGI. После установки каждая печать и запись немедленно переходят на вывод, а не буферизируются. Вы должны установить это для каждого дескриптора файла. Используйте select чтобы изменить дескриптор файла по умолчанию, например:

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

    Что происходит, когда вы запускаете его из командной строки с CGI-подобной средой?

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

    Отменить или удалить эти переменные

    • PATH
    • LD_LIBRARY_PATH
    • все переменные ORACLE_*

    Установите эти переменные

    • REQUEST_METHOD (устанавливается в GET , HEAD или POST если необходимо)
    • SERVER_PORT (обычно — 80)
    • REMOTE_USER (если вы делаете защищенный доступ)

    В последних версиях CGI.pm (> 2.75) требуется флаг -debug для получения старого (полезного) поведения, поэтому вам, возможно, придется добавить его в свой импорт CGI.pm

    Вы используете die() или warn ?

    Эти функции печатаются в STDERR если вы не переопределили их. Они также не выводят заголовок CGI. Вы можете получить такую ​​же функциональность с такими пакетами, как CGI::Carp

    Что происходит после очистки кеша браузера?

    Если вы считаете, что ваш скрипт работает правильно, а когда вы выполняете запрос вручную, вы получаете правильный вывод, возможно, причиной этого является браузер. Очистите кеш и установите размер кеша на ноль во время тестирования. Помните, что некоторые браузеры действительно глупы и фактически не перезагружают новый контент, даже если вы говорите ему об этом. Это особенно распространено в случаях, когда путь URL-адреса одинаков, но содержимое изменяется (например, динамические изображения).

    Это сценарий, где вы так думаете?

    Путь файловой системы к скрипту необязательно напрямую связан с URL-адресом сценария. Убедитесь, что у вас есть правильный каталог, даже если вам нужно написать короткий тестовый скрипт, чтобы проверить это. Кроме того, вы уверены, что редактируете правильный файл? Если вы не видите каких-либо изменений в ваших изменениях, вы можете изменить другой файл или загрузить файл в неправильное место. (Это, кстати, моя самая частая причина таких неприятностей;)

    Используете ли вы CGI.pm или его производную?

    Если ваша проблема связана с анализом ввода CGI, и вы не используете широко проверенный модуль, такой как CGI.pm , CGI::Request , CGI::Simple или CGI::Lite , используйте модуль и продолжайте жизнь. CGI.pm имеет cgi-lib.pl совместимости cgi-lib.pl который может помочь вам решить проблемы ввода из-за более старых реализаций CGI-парсера.

    Вы использовали абсолютные пути?

    Если вы используете внешние команды с system , обратными тиками или другими объектами IPC, вы должны использовать абсолютный путь к внешней программе. Вы не только точно знаете, что используете, но и избегаете некоторых проблем с безопасностью. Если вы открываете файлы для чтения или записи, используйте абсолютный путь. Сценарий CGI может иметь другое представление о текущем каталоге, чем вы. Кроме того, вы можете сделать явный chdir() чтобы поместить вас в нужное место.

    Вы проверили свои возвращаемые значения?

    Большинство функций Perl скажут вам, работают ли они или нет, и установит $! при сбое. Вы проверили возвращаемое значение и изучили $! для сообщений об ошибках? Вы проверяли [email protected] если вы использовали eval ?

    Какую версию Perl вы используете?

    Последняя стабильная версия Perl — 5.16.2. Используете ли вы более старую версию? В разных версиях Perl могут быть разные идеи предупреждений.

    Какой веб-сервер вы используете?

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

    Вы проверили документацию на сервере?

    Серьезные программисты CGI должны знать как можно больше о сервере, включая не только возможности и поведение сервера, но и локальную конфигурацию. Документация для вашего сервера может быть недоступна для вас, если вы используете коммерческий продукт. В противном случае документация должна быть на вашем сервере. Если это не так, найдите его в Интернете.

    Вы искали архивы comp.infosystems.www.authoring.cgi ?

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

    Можете ли вы воспроизвести проблему с помощью короткого тестового сценария?

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

    Вы решили пойти посмотреть фильм?

    Шутки в сторону. Иногда мы можем быть настолько увлечены проблемой, что мы разрабатываем «сужение перцепции» (туннельное видение). Перерыв, получение чашки кофе или взрыв некоторых плохих парней в [Duke Nukem, Quake, Doom, Halo, COD] могут дать вам свежую перспективу, что вам нужно снова подойти к проблеме.

    Вы озвучили проблему?

    Серьезно снова. Иногда объяснение проблемы вслух приводит нас к нашим собственным ответам. Поговорите с пингвином (плюшевая игрушка), потому что ваши сотрудники не слушают. Если вы заинтересованы в этом как серьезном инструменте отладки (и я рекомендую его, если вы еще не нашли проблему), вам также может понравиться прочитать «Психология компьютерного программирования» .

    Вы можете запустить perl cgi-script в терминале, используя следующую команду:

    Он интерпретирует код и обеспечивает результат с помощью HTML-кода. Он будет сообщать об ошибке, если таковой имеется.

    Компьютерный портал osblog

    Так сложилось, что я знаю как минимум двух человек, которые хотели бы выучить Perl. Специально для них я решил написать этот пост.

    • Часть 1: Типы переменных (вы читаете эту часть)


    В нем вы найдете примеры простых программ из серии «вывести числа от 1 до 5» и тому подобное. Мне всегда нравилось учиться на примерах — это интереснее и быстрее, чем по книжкам или на семинарах. Также можете посмотреть посты этого блога, — велика вероятность, что в них вы найдете еще примеры.

    Я предполагаю, что в школе/институте вы изучали Pascal/Delphi, C или хотя бы Basic, и объяснять, что такое функция и циклы не требуется. Если это не так — ничего страшного, просто для того, чтобы во всем разобраться, вам придется потратить лишнее время на чтение Википедии. Если вы не знаете, как запустить bash-скрипт, или для чего в первой строке скрипта писать что-то вроде #!/bin/sh , придется немного погуглить , чтобы это выяснить.

    Специально для тех, кого интересуют вопросы, «а правда ли, что Perl очень сложен», «а какие книжки по Perl можете посоветовать» и даже «эээ… а что, на нем еще пишут?», я написал Mini-FAQ по Perl , которое вы можете прочитать на HabraHabr. А для тех, кто неасилил многабукв здесь я приведу краткое его содержание:

    • Perl — современный язык программирования, на котором пишут и будут писать еще очень долго.
    • Perl, как и любой другой язык программирования, имеет свои достоинства, недостатки и области применения. Существует действительно большой класс задач, которые Perl решает на 5+.
    • Синтаксис Perl не сложнее синтаксиса C++ или Java. В этом вы сможете убедиться, дочитав данный пост до конца.
    • Существуют хорошие и при этом недорогие учебники по Perl. Также в сети вы без труда найдете сообщество perl-программистов, говорящих на вашем родном языке.
    • Perl хорошо работает как под операционными системами семейства UNIX, так и под Злом Windows.

    Дополнение: Также я рекомендую вам ознакомиться со статьями Perl vs Python vs Ruby vs PHP и Жрецы программирования . Первая повествует о производительности различных скриптовых языков, вторая — об отличии PHP от других ЯП. Фанатам Пайтона советую прочитать заметку Тест производительности скриптов на Python . Надеюсь, что эти материалы помогут вам найти ответ на вопрос «чем хорош Perl».

    Привет, %username%!

    Итак, давайте уже напишем наш первый скрипт на Perl!

    $name = shift () ;
    print («Hello, $name! \n » ) ;

    $ chmod u+x 1 .pl
    $ ./ 1 .pl afiskon
    Hello, afiskon!

    Тут все очень просто:

    • Имена скалярных переменных (то есть не массивов и не хэшей, что это такое — см ниже) начинаются со знака доллара.
    • Функция shift возвращает очередной аргумент скрипта. Другими словами первый вызов shift() возвращает первый аргумент, второй вызов — второй аргумент и так далее.
    • Функция print() выводит строку, переданную в качестве аргумента.
    • В строку можно подставлять значения переменных (см строку 4). Подробнее о строках — см далее.

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

    Типы переменных

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

    Скаляры мы уже использовали в предыдущем примере. Вот еще несколько примеров задания скаляров.

    $a = 123 ;
    $b = — 7.496 ;
    $c = 0xABC; # равно 2748, да, это комментарий:)
    $d = ($a + $b ) / $c ;
    $d *= $a ; # тоже самое, что $d = $d * $a;

    $str1 = «hello» ;
    $str2 = «$str1, world» ; # в $str2 записано «hello, world»
    $str3 = $a . » \n » . $str2 ;
    $str4 = «$str1» ; # в $str4 записано «$str1», а не «hello»

    Тут мы задаем положительные и отрицательные, целые и дробные числа, задаем число в шестнадцатеричной кодировке, складываем, умножаем и делим — все как в Си или Java. Кроме перечисленных операций Perl также поддерживает операцию возведения в степень:

    $a = 2 ** 8 ; # результат: 256

    Со строками все примерно так же, как в каком-нибудь PHP. Точка означает операцию конкатенации (то есть «склеивания» строк), если в строке содержатся имена переменных, на их место подставляются значения, с помощью обратного слэша можно вставлять символы новой строки (\n), табуляции (\t), кавычки (\»), сам обратный слэш (\\) знак доллара безо всякой подстановки переменных (\$) и многое другое. Если строка в одинарных кавычках, символы в ней трактуются «как есть», без подстановки переменных и тд.

    Как и PHP, Perl интерпретирует скаляры, как числа или как строки в зависимости от операции. Все просто:

    $int1 = «11» + 22 ;
    # ^ строка «11» преобразуется в число,
    # после чего выполняется сложение, результат: 33.
    $str1 = «11» . 22 ;
    # ^ число 22 преобразуется в строку,
    # после чего выполняется конкатенация, результат: «1122».

    Правила преобразования из строки в число и наоборот тут те же, что и в PHP:

    $str1 = 0 . «abc» ;
    # ^ результат — «abc», число ноль преобразуется в пустую строку
    $int1 = «aaa» + 1 ;
    # ^ результат — 1, в строке «aaa» нет цифр
    $int2 = «12aaa» + 1 ;
    # ^ результат — 13, учитываются только первые цифры строки

    Кстати, для объявления длинных строк существуют специальные операторы — q и qq:

    # аналогично одинарным кавычкам
    $text = q <
    Do you have $15 ?
    > ;
    # аналогично двойным кавычкам
    $message = qq <
    Hello, $username !
    How are you?
    > ;

    Работа с массивами происходит следующим образом:

    $scalar = «bebebebe» ;
    ($a , $b ) = (1 , 2 ) ; # тоже самое, что $a = 1; $b = 2;
    @arr = («aaa» , 123 , $scalar , $a + $b ) ;
    print $arr [ 1 ] . » \n » ;
    push @arr , $a ;
    print pop (@arr ) . » \n » ;

    Здесь мы создаем массив @arr, состоящий из 4-х элементов (строка 5). Затем выводим второй элемент (строка 6). Нумерация элементов начинается с нуля, поэтому для вывода второго по счету элемента используется индекс 1. Затем кладем в конец массива значение переменной $a (функция push, строка 7), и тут же извлекаем и выводим его (функция pop, строка 8).

    Обратите внимание, имена массивов начинаются с «собаки», а не доллара (запомнить не сложно — соответствующие символы похожи на первые буквы английских названий типов: $ — scalar, @ — array). При обращении ко второму элементу массива (строка 6) использовался знак доллара, потому что элемент массива является скаляром. По началу это вызывает много путаницы, но вообще все логично.

    Еще в этом скрипте мы вызываем функции print и push без скобок. В Perl при вызове функции, везде, где это не вызывает неопределенности, скобки можно опустить.

    Для объявления массива, элементами которого являются строки без пробелов, существует специальный оператор — qw:

    @arr = qw/aaa bbb ccc/ ;
    # аналогично («aaa», «bbb», «ccc»), только короче

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

    %hash = ( # при объявлении хэшей и массивов можно
    «x» => 12 , # использовать перенос строк
    y => 53 , # если в ключе нет спец-символов, кавычки не нужны
    «z» => — 10.5 , # запятую на конце можно оставлять
    ) ;

    $hash < "x" >++; # координата по x теперь равна 13
    $hash < y >—; # координата по y теперь равна 52

    # выводим координаты
    print «x = $hash, y = $hash, z = $hash\n » ;

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

    Кстати, переменные $test, @test и %test — это совершенно независимые друг от друга переменные разного типа.

    В этом месте я хотел перейти к условным операторам и циклам for/while, но понял, что для одного поста текста и так уже многовато. Между тем за кадром остались многие вопросы:

    • Условные операторы;
    • Циклы for и while;
    • Объявление функций;
    • Работа с потоками и файлами;
    • Строгий синтаксис;
    • Использование готовых модулей и классов.

    Об этом я напишу в одной из следующих заметок. Хотелось бы получить хотя бы парочку комментариев на этот пост — интересно/неинтересно, понятно/непонятно и так далее. Кстати, если у вас есть вопросы, связанные с Perl (не обязательно с этим постом) — смело задавайте их в комментариях!

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

    Что такое Perl?

    Perl является интерпретируемым языком, созданным программистом Лари Уоллом (Larry Wall) для обработки больших текстов и файлов и расшифровывается, как Practical Extraction and Report Language (язык для практического извлечения данных и составления отчетов). С помощью Perl вы, например, можете создать скрипт, который открывает один или несколько файлов, обрабатывает информацию и записывает результаты.

    С изобретением World Wide Web, Perl оказался прекрасным средством для взаимодействия с web-серверами через Common Gateway Interface (CGI) — общий интерфейс взаимодействия. Команды Perl могут легко получить данные из формы HTML или другого источника и что-нибудь с ними сделать.

    Как Perl обрабатывает данные из форм

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

    • добавить их в текстовый файл,
    • ввести их в базу данных,
    • вставить их в электронное письмо,
    • добавить их в существующую web-страницу,
    • создать новую web-страницу,
    • отобразить их в окне браузера.

    Некоторые из этих примеров рассматриваются в нашем уроке.

    Как генерируются web-страницы «на лету»

    Больше всего впечатляет то, что Perl может быть использован для создания web-страниц «на лету» в ответ на запрос или действие пользователя. Новая страница может быть

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

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

    В чем различие между программой и скриптом?

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

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

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

    Альтернативы Perl

    Существует несколько альтернатив использованию Perl:

    • С, Visual Basic — более традиционные компьютерные языки для обработки вводимых данных. Должны компилироваться под определенную платформу.
    • ActiveX — включение программных компонент, выполняющихся в браузере.
    • JavaScript, VBScript — обеспечивают некоторую интерактивность HTML страниц, которую HTML обеспечить не может.
    • Cold Fusion — сторонняя программа для связи форм с базами данных.
    • PHP/FI — еще одна сторонняя программа для связи форм с базами данных.

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

    Что вам требуется, чтобы запустить Perl

    Для запуска Perl вашей системе понадобится несколько компонент:

    1. Скрипт, написанный вами или предложенный вам другим, сохраненный в текстовом файле.
    2. Perl интерпретатор. Любой Perl скрипт в первой строке содержит путь к этой программе.
    3. Web-страница с которой будет запускаться этот скрипт. Она может содержать форму или просто ссылку, если скрипт не требует входных данных.
    4. Web-сервер. Взаимодействие между web-страницей и скриптом производится сервером. Поэтому вы должны иметь доступ к web-серверу с возможностью записи и запуска на нем скриптов.

    Где взять Perl

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

    • Общая информация о Perl — https://www.perl.com/perl/index.html
    • Perl для UNIX — https://www.perl.com/perl/info/software.html
    • Perl для Win32 — https://ntperl.hip.com

    Этапы создания скрипта

    После того, как вы установили на своем компьютере необходимое ПО, нужно совершить несколько шагов для запуска Perl на вашем узле:

    1. Создать форму для вызова скрипта.
    2. Создать сам скрипт.
    3. Отладить скрипт. Проверить отсутствие ошибок (если это возможно, лучше проверить все возможные пути выполнения программы).
    4. Поместить скрипт на сервер и не забыть дать ему права на выполнение.
    5. Связать скрипт с формой, вставив его имя в параметр action тэга form. Например:
    Добавить комментарий