Как запустить интерактивную консоль для Perl? - PullRequest
244 голосов
/ 16 сентября 2008

Как запустить интерактивную консоль для Perl, аналогично команде irb для Ruby или python для Python?

Ответы [ 22 ]

6 голосов
/ 17 сентября 2008

re.pl от Devel :: REPL

6 голосов
/ 16 сентября 2008

perl -d ваш друг:

% perl -de 0
5 голосов
/ 17 сентября 2013

Цикл чтения-проверки-печати:

$ perl -e'while(<>){print eval,"\n"}'
5 голосов
/ 18 сентября 2008

Я всегда так делал:

perl -wlne'eval;print$@if$@'

С 5.10 я переключился на:

perl -wnE'say eval()//$@'
4 голосов
/ 16 сентября 2008

Perl не имеет консоли, но отладчик может использоваться как один. В командной строке введите perl -de 1. (Значение «1» не имеет значения, это просто правильное утверждение, которое ничего не делает.)

Существует также несколько вариантов оболочки Perl .

Для получения дополнительной информации читайте perlfaq3 .

3 голосов
/ 05 марта 2016

Под Debian / Ubuntu:

$ sudo apt-get install libdevel-repl-perl
$ re.pl

$ sudo apt-get install libapp-repl-perl
$ iperl
3 голосов
/ 16 сентября 2008

Вы можете посмотреть psh здесь: http://gnp.github.io/psh/

Это полная оболочка (например, вы можете использовать ее вместо bash), но использует синтаксис perl ... поэтому вы можете создавать методы на лету и т. Д.

2 голосов
/ 08 июля 2015

Обновление: с тех пор я создал загружаемый REPL - см. мой другой ответ .

Оглядываясь назад:

  • сторонние решения , упомянутые среди существующих ответов, либо громоздки для установки и / или не работают без нетривиальных, неочевидных дополнительных шагов - появляются некоторые решения быть как минимум наполовину брошенным.
  • Для пригодного для использования REPL требуется библиотека readline для поддержки клавиатуры для редактирования командной строки и поддержки истории - это проблема для многих сторонних решений.
  • Если вы устанавливаете CLI rlwrap, который обеспечивает поддержку readline для любой команды, вы можете объединить ее с простой командой Perl для создания пригодного REPL и, таким образом, обойтись без сторонних решений REPL ,
    • На OSX вы можете установить rlwrap через Homebrew с brew install rlwrap.
    • Linux дистрибутивы должны предлагать rlwrap через соответствующих менеджеров пакетов; например, в Ubuntu используйте sudo apt-get install rlwrap.
    • См. ответ Яна Шареника относительно указанной комбинации rlwrap и команды Perl.

Что вы НЕ получите с ответом Яна:

  • автозавершение
  • возможность ввода многострочных операторов

Единственное стороннее решение, которое предлагает эти (с нетривиальной установкой + дополнительные, неочевидные действия), это psh , но:

  • он не видел активности около 2,5 лет

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


Ответ Яна Шареника может быть улучшен одним способом:

  • По умолчанию он печатает массивы / списки / хеш-таблицы как скаляры , т. Е. Печатает только их количество элементов , тогда как было бы удобно перечислять их элементы вместо.

Если вы устанавливаете модуль Data::Printer с [sudo] cpan Data::Printer в качестве одноразовой операции, вы можете загрузить его в REPL для использования функции p(), для которой вы может передавать списки / массивы / хеш-таблицы для перечисления.

Вот псевдоним с именем iperl с readline и поддержкой Data::Printer , который вы можете поместить в файл инициализации вашей POSIX-подобной оболочки (например, ~/.bashrc):

alias iperl='rlwrap -A -S "iperl> " perl -MData::Printer -wnE '\''BEGIN { say "# Use `p @<arrayOrList>` or `p %<hashTable>` to print arrays/lists/hashtables; e.g.: `p %ENV`"; } say eval()//$@'\'

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

$ iperl        # start the REPL
iperl> p %ENV  # print key-value pairs in hashtable %ENV

Как и в ответе Яна, скалярное результат выражения автоматически печатается; e.g.:

iperl> 22 / 7  # automatically print scalar result of expression: 3.14285714285714
1 голос
/ 31 мая 2016

Обзор Мэтта Траута содержит пять вариантов, начиная с perl -de 0, и рекомендует Reply, если важна расширяемость с помощью плагинов, или tinyrepl из Eval::WithLexicals, для минимального решения на чистом Perl, которое включает поддержку readline и лексическое постоянство.

0 голосов
/ 16 сентября 2008

Также ищите ptkdb на CPAN: http://search.cpan.org/search?query=ptkdb&mode=all

...