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

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

22 ответов


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

perl -de1

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


Мэтт Траут не только написал статью о РЕПЛЕ, он даже написал одну - Devel:: REPL

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

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


Я написал сценарий, который я называю "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

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

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

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

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


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

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

Если вы хотите историю, использовать 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> 

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

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

надеюсь, что это помогает!


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

   perl -d -e 1

есть два популярных Perl REPLs.
1. Devel:: REPL - это здорово.
2. Но ИМО!--5-->ответ - это лучше.


Я создал perli, a Perl REPL что работает на Linux, OS X и Windows.

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

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

установка

  • если у вас есть узел.Яш установлено:

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

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

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


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

% perl -de 0

re.pl от Devel:: REPL


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

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

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

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

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

есть также несколько вариантов для Perl shell.

подробнее perlfaq3.


цикл Read-eval-print:

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

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

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


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

С оглядкой на прошлое:

  • на сторонние решения упоминается среди существующих ответов, либо громоздко устанавливать и / или не работать без нетривиальных, неочевидных дополнительных шагов - некоторые решения, по-видимому, по крайней мере наполовину заброшены.
  • полезный REPL нужна библиотека readline для поддержки клавиатуры редактирования командной строки и поддержки истории - обеспечение этого является проблемным местом для многих сторонних решений.
  • если вы устанавливаете CLI rlwrap, который обеспечивает поддержку readline для любой команды, вы можете объединить его с простой командой Perl, чтобы создать полезный REPL, и таким образом обойтись без сторонних решений REPL.
    • на OSX, вы можете установить rlwrap via доморощенного С 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()//$@'\'

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

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

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

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

В Debian / Ubuntu:

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

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

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


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


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


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