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

236

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

Теги:
console
interactive
read-eval-print-loop

22 ответа

253
Лучший ответ

Вы можете использовать отладчик perl в тривиальной программе, например:

perl -de1

Альтернативно там приложение Alexis Sukrieh Perl Console, но я не использовал его.

  • 18
    Если вы хотите что-то минимально пригодное для использования, подумайте о добавлении rlwrap $ rlwrap perl -d -e 1 Вы получите историю и непротиворечивое приглашение
  • 0
    control + L не работает в этом командном интерфейсе, как мне обновить экран?
Показать ещё 3 комментария
58

Мало того, что Мэтт Траут написал статью о REPL, он на самом деле написал один - Devel:: REPL

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

Кстати, я не знаю, почему кто-то изменил человека, который упомянул использование "perl -e" с консоли. Это не REPL, правда, но это фантастически полезно, и я использую его все время.

  • 0
    Думаю, предполагалось, что я не понял вопроса. Я думаю, я немного отредактирую это. ;-)
  • 0
    По состоянию на середину 2015 года: просто запуск [sudo] cpan Devel::REPL у меня не работал ни на OSX 10.10 (Perl 5.18.2), ни на Ubuntu 14.04 (Perl 5.18.2): я получаю ошибки времени выполнения, жалующиеся на недостающие модули; установил один, затем сдался после того, как другой пропавший модуль был сообщен.
Показать ещё 4 комментария
33

Я написал script я называю "psh":

#! /usr/bin/perl

while (<>) {
  chomp;
  my $result = eval;
  print "$_ = $result\n";
}

Что бы вы ни вводили, он оценивается в Perl:

> gmtime(2**30)
gmtime(2**30) = Sat Jan 10 13:37:04 2004

> $x = 'foo'
$x = 'foo' = foo

> $x =~ s/o/a/g
$x =~ s/o/a/g = 2

> $x
$x = faa
  • 2
    Работает ли это только для однострочников или может обрабатывать многострочный код Perl, такой как условное ветвление, циклы, вложенные операторы?
  • 0
    @ Дэвид: Это работает только с однострочниками.
19

Если вы хотите историю, используйте rlwrap. Это может быть ваш ~/bin/ips, например:

#!/bin/sh
echo 'This is Interactive Perl shell'
rlwrap -A -pgreen -S"perl> " perl -wnE'say eval()//$@'

И вот как это выглядит:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 
  • 4
    Престижность за его завершение - поддержка readline необходима не только для истории, но и для редактирования командной строки. За исключением поддержки нескольких строк, это работает хорошо; вот альтернативная версия в качестве альтернативы: alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\' . Пользователи OSX могут установить rlwrap через Homebrew с помощью brew install rlwrap .
19

Я использую командную строку в качестве консоли:

$ perl -e 'print "JAPH\n"'

Затем я могу использовать историю bash для возврата старых команд. Однако это не сохраняет состояние.

Эта форма наиболее полезна, когда вы хотите протестировать "одну мелочь" (например, при ответе на вопросы Perl). Часто я нахожу, что эти команды добираются дословно в оболочку script или makefile.

  • 1
    С некоторыми раковинами, например fish , вам даже не нужен \n .
19

Я думаю, вы спрашиваете об интерфейсе REPL (Read, Evaluate, Print, Loop) для perl. Есть несколько способов сделать это:

  • Мэтт Траут статья, в которой описывается, как писать
  • Адриано Феррейра описал некоторые параметры
  • и, наконец, вы можете прыгать на IRC на irc.perl.org и попробовать один из богов eval во многих популярных каналах. Они будут оценивать фрагменты perl, которые вы передаете им.
15

Не существует интерактивной консоли для Perl, построенной как Python. Тем не менее, вы можете использовать Perl Debugger для отладки связанных вещей. Вы включаете его с опцией -d, но вы можете проверить "man perldebug", чтобы узнать об этом.

После нескольких поисковых запросов есть отдельный проект, который реализует консоль Perl, которую вы можете найти в http://www.sukria.net/perlconsole.html.

Надеюсь, это поможет!

  • 0
    Странно, что этот ответ не получил никаких голосов, хотя он был раньше, чем принятый ответ и предоставляет немного больше информации. +1
14

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

   perl -d -e 1
11

Есть два популярных Perl REPL.
1. Devel::REPL отлично.
2. Но IMO Reply лучше.

  • 6
    +1 за рекомендацию Ответить. Автор Devel :: REPL сам порекомендовал Ответить поверх собственного решения, когда я спрашиваю о хорошей Perl REPL (консоли) в IRC. Ответ также поставляется с автозаполнением, что очень удобно для проверки доступных методов и атрибутов объекта. Я мог установить Reply в Ubuntu с помощью следующей команды: sudo apt-get install libreply-perl . Затем его можно запустить, просто набрав reply в терминале.
10

Я создал perli, Perl REPL, который работает на Linux, MacOS и Windows.

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

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

Монтаж

  • Если у вас установлен Node.js:

    npm install -g perli
    
  • Иначе:

    • Unix-подобные платформы: загрузите этот скрипт как perli в папку в системном пути и сделайте его исполняемым с помощью chmod +x.

    • Windows: Загрузите этот скрипт как perli.pl (обратите внимание на расширение .pl) в папку в системном каталоге.
      Если вы не возражаете, вызывая perli.pl как perli.pl, все готово.
      В противном случае создайте пакетный файл с именем perli.cmd в той же папке со следующим содержимым: @%~dpn.pl %*; это позволяет вызывать как только perli.

  • 1
    Мне нравится это можно запустить perldoc из perli РЕПЛ как 'someCommand ?' , Похоже, что он не обновлялся некоторое время, вы все еще поддерживаете Perli?
  • 1
    @sdkks: Если вы обнаружите проблему, сообщите об этом на GitHub, и я постараюсь ее исправить. perli не обновлялся в течение некоторого времени, потому что в моем личном использовании я не сталкивался с какими-либо проблемами, и немногие другие люди, кажется, используют его, но, насколько я знаю, он все еще работает так, как рекламируется.
6

re.pl из Devel:: REPL

6

perl -d - ваш друг:

% perl -de 0
5

Цикл чтения-eval-print:

$ perl -e'while(<>){print eval,"\n"}'
5

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

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

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

perl -wnE'say eval()//$@'
4

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

Существует также пара опций оболочка Perl.

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

3

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

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

2

В Debian/Ubuntu:

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

$ sudo apt-get install libapp-repl-perl
$ iperl
2

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

В свете ретроспективы:

  • сторонние решения, упомянутые среди существующих ответов, либо громоздки для установки и/или не работают без нетривиальных, неочевидных дополнительных шагов - некоторые решения кажутся, по крайней мере, полузаброшенными.
  • Используемый REPL нуждается в библиотеке readline для поддержки клавиатуры и поддержки клавиатуры и поддержки истории. Это означает, что это проблема для многих сторонних решений.
  • Если вы устанавливаете CLI rlwrap, который предоставляет поддержку readline любой команде, вы можете объединить ее с простой командой Perl для создания полезной REPL и, таким образом, обойтись без стороннего REPL решения.
    • В OSX вы можете установить rlwrap через Homebrew с помощью brew install rlwrap.
    • Linux-дистрибутивы должны предлагать rlwrap через своих соответствующих менеджеров пакетов; например, на Ubuntu, используйте sudo apt-get install rlwrap.
    • Обратитесь к Ján Sáreník answer за указанную комбинацию rlwrap и команду Perl.

Что вы НЕ получаете с ответом Ján:

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

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

  • он не видел активности примерно через 2,5 года

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


Ответ Ján Sáreník может быть улучшен одним способом:

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

Если вы устанавливаете модуль 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()//$@'\'

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

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

Как и в случае ответа Ján, скалярный результат выражения автоматически печатается; например:.

iperl> 22 / 7  # automatically print scalar result of expression: 3.14285714285714
1

Matt Trout обзор содержит пять вариантов: от perl -de 0 и далее Reply, если важна расширяемость через плагины, или tinyrepl из Eval::WithLexicals, для минимального, чисто-perl-решение, которое включает поддержку readline и лексическую настойчивость.

0

См. также Стильный REPL (для GNU Emacs) http://blog.jrock.us/articles/Stylish%20REPL.pod

0

Сепия и PDE также имеют собственные REPL (для GNU Emacs).

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню