Руководство Брайана по решению любой проблемы в Perl

Брайан Д. Фой (brain d foy)
Перевод в PODe

Аннотация

Следуйте данному руководству и сохраните свое психическое равновесие


Моя философия отладки

Я верю в три вещи:

Это не касается лично вас

Забудьте о том, что написали код вы. Можете считать себя гуру, но даже гуру допускают много дерьма. Каждый код является дерьмом, это значит, что ваш код дерьмо и мой код тоже. Научитесь это любить. Когда сталкиваетесь с проблемой, сразу думайте: «что-то случилось с моим дерьмовым кодом», а не вините Perl. Это не касается лично вас.

Забудьте о том, как вы делаете что-нибудь. Если бы у вас все работало, то вы бы не читали данное руководство. В этом нет ничего плохого. Это время для развития. Мы все через это проходили.

Личная ответственность

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

Измените подход

Исправьте все, чтобы потом не сталкиваться с такой же проблемой. Возможно, проблема заключается в том, как, а не что программируете. Перестаньте упрощать себе жизнь. Не надо Perl адаптировать к себе, это невозможно. Адаптируйтесь к Perl сами. Perl — язык программирования, а не образ жизни.

Мой Метод

Программа компилируется в strict-режиме?

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

Можете использовать режим strict в скриптах, подключив strict-прагму.

        use strict;

Можете подключить режим strict при запуске из командной строки через perl -M

        perl -Mstrict script.pl

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

Что такое предупреждение?

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

        #!/usr/bin/perl -w

Можете включить режим предупреждений из командной строки.

        perl -w script.pl

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

Если вы не понимаете предупреждение, можете посмотреть расширенную версию предупреждений в perldiag или можете использовать diagnostics-прагму.

        use diagmostics;
Решите первую проблему первой!

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

Смотрите на несколько строк выше, чем указано в сообщении об ошибке!

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

Значение именно такое, которое вы ожидаете?

Не гадайте! Проверяйте истиность значения до того, как будете использовать его в выражении. Самый лучший на свете отладочный код — print.

        print STDERR "The value is [$value]\n";

Я ограничиваю переменную $value квадратными скобками, чтобы увидеть начальные и конечные пробельные символы и переносы строк.

Если речь идет не о скаляре, то следует использовать модуль Data::Dumper для распечатки структуры данных.

        require Data::Dumper;
        print STDERR "The hash is ", Data::Dumper::Dumper( %hash ), "\n";

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

Также можете использовать встроенный в perl отладчик с помощью perl -d. Подробнее смотрите perldebug.

        perl -d script.pl

Или можете использовать другие дебаггеры и отладочные системы, например, ptkdb (графический дебаггер, написанный на Tk) или Komodo (Perl IDE от ActiveState, основанный на Mozilla).

Верно ли используете функции?

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

Можете получить описание функции, воспользовавшись командой perldoc с ключом -f.

        perldoc -f function_name

Если в программе используете модуль, то проверьте документацию, чтобы убедиться, что вы делаете все верно. Для того, чтобы получить документацию по модулю, используйте perldoc.

        perldoc Module::Name
Используете верные специальные переменные?

Снова я ссылаюсь на perlvar. С тех пор, как я обнаружил, что The Perl Pocket Reference намного удобнее, это не так.

Используете нужную версию модуля?

Некоторые модули меняются от версии к версии. Используете ту версию модуля, которую предполагаете? Версию для большинства модулей можно проверить с помощью простого однострочного perl-выражения.

        perl -MModule::Name -le 'print Module::Name->VERSION'

Если вы пользуетесь документацией с онлайн источников таких, как http://www.perldoc.com или http://search.cpan.org, то можете столкнуться с различиями в документации.

Пишите ли небольшие тестовые примеры?

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

Проверяете переменные окружения?

Некоторые программы зависят от переменных окружения. Вы уверены, что они определены верно? Ваше окружение совпадает с окружением программы, когда она будет запущена? Помните, что программы, запускаемые как CGI-приложения или запланированные через cron, могут иметь окружение, отличное от вашего, особенно на разных машинах.

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

Если все-таки возникают проблемы, то просмотрите переменные окружения.

        require Data::Dumper;
        print STDERR Data::Dumper::Dumper( \%ENV );
Искали в Google?

Если у вас возникла проблема, то вероятно, что кто-то уже сталкивался с ней. Посмотрите usenet-группу comp.lang.perl.misc, используя Google Groups. Разница между человеком, задающем вопросы на usenet, и теми, кто отвечает на них, состоит в способности эффективно использовать Google Groups.

Профилируете приложение?

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

Какие тесты провалились?

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

Если набора тестов нет, то почему бы его не сделать? Если у вас, действительно, небольшой скрипт или отдельный скрипт, то я не буду заставлять вас писать тесты. В противном случае, вы, действительно, получите пользу от нескольких тестов. Test::Harness делает этот процесс таким простым, что вы не имеете права не делать это. Если у вас нет времени на тесты, то возможно вы потеряете намного больше времени для отладки скриптов без тестов. MakeMaker предназначен не только для модулей, в конце концов.

Разговариваете с медведем?

Проговорите проблему вслух. На самом деле, проговорите слова.

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

Скорей всего вам это придется делать очень часто, советую выбрать в качестве Perl-терапевта что-то типа плюшевой игрушки и не досаждать коллегам. У меня на столе сидит маленький мишка и я объясняю ему свои проблемы. Моя подруга больше не обращает внимания, когда я разговариваю сам с собой.

Проблема на бумаге сохранилась?

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

Смотрели «Пусть говорят» с Андреем Малаховым? *

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

* В оригинале — «Ежедневное шоу» с Джоном Стюартом

Вы считаетесь со своим я?

Если не сделаете этого, проблема может стать психологической. Возможно, вы будете морально подавлены фрагментами кода, если не решите всех проблем. Также можете думать, что каждый ошибается, но не вы. Когда вы так делаете, то не воспринимаете серьезно, что источник большинства багов — вы сами. Ничего не игнорируйте. Проверяйте все.

Автор

brian d foy, <bdfoy@cpan.org>


Авторское право

(c) 2002, Perl Documentation Project.

Все права сохранены