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

Ответы:

297

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

perl -de1

В качестве альтернативы есть консольное приложение Алексиса Сукрие , но я им не пользовался.

Даниэль Папасян
источник
28
Если вы хотите что-то минимально пригодное для использования, подумайте о добавлении rlwrap. $ rlwrap perl -d -e 1 Вы получите историю и непротиворечивое приглашение
albfan
control+ Lне работает в этом командном интерфейсе, как мне обновить экран?
Дзен
1
Оглядываясь назад, можно сказать, что ответ Яна Шареника, по- видимому, является наилучшим практически готовым решением (возможно, вам придется установить rlwrap). Все сторонние решения REPL / консоли, в том числе perlconsole, сложны в установке и часто имеют больше ограничений.
mklement0
3
К сожалению, perl -de1похоже, что myпеременные не поддерживаются , и хеши по какой-то причине тоже не работают ...
Геремия
1
perlconsoleне страдает от этих проблем.
Геремия,
60

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

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

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

Дейв Рольски
источник
Думаю, предполагалось, что я не понял вопроса. Я думаю, я немного отредактирую это. ;-)
Джон Эриксон
По состоянию на середину 2015 года: просто запуск [sudo] cpan Devel::REPLне работал для меня, ни в OSX 10.10 (Perl 5.18.2), ни в Ubuntu 14.04 (Perl 5.18.2): я получаю ошибки времени выполнения с жалобами на отсутствующие модули; установил один, затем сдался после того, как другой пропавший модуль был сообщен.
mklement0
@ mklement0 Существует настройка cpan для автоматической загрузки и сборки необходимых компонентов. Возможно, вам придется включить эту настройку. В качестве альтернативы, приложение cpanminus с нулевой конфигурацией может быть лучшим вариантом.
Морская звезда
@Starfish: Спасибо; чтобы сэкономить время будущих читателей (поскольку звучит так, будто ответ может быть коротким): как включить этот параметр?
mklement0
1
Кстати, Мэтт Траут, re.plавтор, написал статью, в которой перечислены несколько альтернатив, и он сам предлагает replyвместо re.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Денилсон Са Майя
36

Я написал скрипт, который я называю "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
Raldi
источник
4
Работает ли это только для однострочников или может обрабатывать многострочный код Perl, такой как условное ветвление, циклы, вложенные операторы?
Дэвид
23

Если вы хотите историю, используйте 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.
mklement0
Вот версия, которая дает хороший вывод, когда выражение вычисляется в виде списка или ссылки:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
michau
21

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

  • Мэтт Траут имеет статью, которая описывает, как написать один
  • Адриано Феррейра описал несколько вариантов
  • и, наконец, вы можете перейти на IRC по адресу irc.perl.org и попробовать один из самых популярных ботов на многих популярных каналах. Они будут оценивать куски Perl, которые вы им передаете.
amoore
источник
1
Статья Matt Траута была вниз , так как несколько лет назад, вы можете найти его здесь: web.archive.org/web/20100212100032/http://chainsawblues.vox.com/...
Lepe
1
У Мэтта Траута теперь есть гораздо более актуальный список реплик, которые он рекомендует: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic
20

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

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

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

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

Джон Эриксон
источник
1
С некоторыми снарядами, вроде fish, тебе даже не нужно \n.
trysis
15

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

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

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

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

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

   perl -d -e 1
Клинтон Пирс
источник
13

Есть два популярных Perl REPL.

  1. Devel :: REPL отлично.
  2. Но IMO Ответ лучше.
Эрик Джонсон
источник
7
+1 за рекомендацию Ответить. Автор Devel :: REPL сам порекомендовал Ответить поверх собственного решения, когда я спрашиваю о хорошей Perl REPL (консоли) в IRC. Ответ также поставляется с автозаполнением, что очень удобно для проверки доступных методов и атрибутов объекта. Я мог бы установить Ответить на Ubuntu с помощью следующей команды: sudo apt-get install libreply-perl. Затем его можно запустить, просто набрав replyв терминале.
Аптерикс
Как установить AMD Run Ответить? Ни Metacpan, ни страница Github не содержат инструкций.
Филипп
12

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

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

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

Монтаж

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

    npm install -g perli
  • В противном случае:

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

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

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

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

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

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

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

(rlwrap не является обязательным)

ysth
источник
6

perl -d твой друг:

% perl -de 0
Брайан Филлипс
источник
5

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

$ perl -e'while(<>){print eval,"\n"}'
КИМ Тэджюн
источник
4

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

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

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

Майкл Карман
источник
4

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

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

shelfoo
источник
3

Под Debian / Ubuntu:

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

$ sudo apt-get install libapp-repl-perl
$ iperl
gavenkoa
источник
3

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

Давор Кубраник
источник
2

Обновление: с тех пор я создал загружаемый 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()функции, которой вы можете передать списки / массивы / хеш-таблицы для перечисления.

Вот псевдоним с именем iperlreadline и 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

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

iperl> 22 / 7  # automatically print scalar result of expression: 3.14285714285714
mklement0
источник
0

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


источник