Как в Perl посмотреть значение переменной

Задача: хочется понять что находится в переменной внутри Perl программы. Например, есть вот такой код. В нем определяется и используется переменная $person — хочется понять что там содержится.

Old-school решение — использовать Data::Dumper

Чаще всего эта задача решается с помощью подключения модуля Data::Dumper:

use Data::Dumper;

print Dumper $person;

Код.

В ответ мы увидем что-то вроде:

Как Data::Dumper выводит скаляр с объектом

Ну да, что-то тут видно, но это как-то совсем не user-friendly вывод. Вместо unicode символов пишется \x{...}, да и весь вывод какой-то унылый.

Современное решение — использование Data::Printer

В мире соременного Perl есть чудесный и замечательный модуль Data::Printer (вместо длинного названия Data::Printer гораздо удобнее использовать сокращение DDP). Вот как решается эта же задача с помощью DDP:

use DDP;

p $person;

Вот код. При использовании DDP нужно вводить почти в 3 раза меньше текста, но самое главное — это то как выглядит вывод:

Как DDP выводит скаляр с объектом

Вот список почему этот вывод лучше чем вывод Data::Dumper:

Вот еще пример сравнения Data::Dumper и DDP. Вот как эти 2 модуля выводят хеш и массив.

Унылый вариант Data::Dumper:

Как Data::Dumper выводит хеш и массив

И мега вывод DDP:

Как DDP выводит хеш и массив

Конфиг

DDP может быть очень гибко настроен. Мне не совсем подошли настройки DDP из коробки, поэтому у меня есть вот конфиг файл ~/.dataprinter со следующим содержимым:

{
    use_prototypes => 0,
    hash_separator => ' => ',
    index          => 0,
    return_value   => 'void',
    end_separator  => 1,
}

Недостатки DDP

При всем великолепии модуля DDP у него есть недостаки, про которые стоит знать.

  1. Модуль DDP нужно устанавливать. Модуль Data::Dumper идет вместе с Perl. Если установлен perl, то модуль Data::Dumper сразу доступен. А для того чтобы на машине появился модуль DDP нужно предпринять дополнительне действия.
  2. Вывод модуля DDP предназначен только для просмотра человеком, модуль Data::Dumper можно использовать в качестве серелизатора/десерилизатора, но модуль DDP нельзя использовать для этих целей.

Заметки

А почему модуль Data::Printer сокращается до DDP? Мне стало интересно, я задал вопрос и получит ответ.

Резюме

DDP — прекрасная вещь, которой обязательно нужно пользоваться при разработке и дебаге. А еще:

Иван Бессарабов
ivan@bessarabov.ru

24 сентября 2014

Edit this post on GitHub