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


Відповіді:


297

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

perl -de1

Крім того, є програма консолі Perl Олексія Сукрі , але я не використовував її.


27
Якщо ви хочете чогось мінімально корисного, подумайте, щоб додати rlwrap. $ rlwrap perl -d -e 1 Ви отримаєте історію та послідовну підказку
albfan

control+ Lне працює в цьому командному інтерфейсі, як мені оновити екран?
Дзен

1
З користю заднього огляду: відповідь Яна Сареніка, здається, забезпечує найкраще майже нестандартне рішення (можливо, доведеться встановити rlwrap). Всі рішення REPL / консолі сторонніх виробників, в тому числі perlconsole, громіздкі в установці і часто мають більше обмежень.
mklement0

3
На жаль, perl -de1схоже, не підтримуються myзмінні, і хеші чомусь також не працюють ...
Geremia

1
perlconsoleне страждає від цих проблем.
Геремія

60

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

Я трохи використав це, і він працює досить добре, і він знаходиться в активному розвитку.

До речі, я не маю поняття, чому хтось відмовився від особи, яка згадала, що використовує "perl -e" з консолі. Це насправді НЕ ВІДПОВІДЬ, правда, але вона фантастично корисна, і я постійно її використовую.


Я думаю, що передбачалося, що я не розумію питання. Я думаю, я трохи відредагую його. ;-)
Джон Ерісон

Станом на середину 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
Denilson Sá Maia

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

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
Kudos для його красивого завершення - підтримка 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 і спробувати одну з ботів eval на багатьох популярних каналах. Вони оцінять шматки перла, які ви їм передаєте.

1
Стаття Метта Траута вийшла з декількох років тому, ви можете знайти її тут: 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). Часто я виявляю, що ці команди перекопуються дослівно в сценарій оболонки або makefile.


1
З деякими снарядами, наприклад fish, вам навіть не потрібні \n.
трис

15

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

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

Сподіваюсь, це допомагає!


Дивно, що ця відповідь не отримала жодних оновлень, навіть якщо вона була раніше прийнятої відповіді і надає трохи більше інформації. +1
Junuxx

14

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

   perl -d -e 1

13

Є дві популярні відповіді Perl.

  1. Devel :: REPL - це чудово.
  2. Але відповідь ІМО краще.

7
+1 для рекомендування відповіді. Автор Devel :: REPL рекомендував відповісти над власним рішенням, коли я запитав про хороший REPL (консоль) Perl на IRC. Відповідь також надходить із автоматичним доповненням, що дуже зручно для огляду доступних методів та атрибутів об'єкта. Я міг би встановити Відповісти на Ubuntu за допомогою наступної команди: sudo apt-get install libreply-perl. Тоді його можна запустити, просто набравши replyтермінал.
Apteryx

Як встановити відповідь на виконання amd? Ні 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.pl, ви все налаштовані.
      В іншому випадку створіть пакетний файл, названий perli.cmdу тій же папці із наступним вмістом @%~dpn.pl %*:; це дозволяє виклику як просто perli.


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 не обов’язковий)



6

re.pl від Devel :: REPL



4

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

Існує також пара варіантів оболонки Perl .

Для отримання додаткової інформації читайте perlfaq3 .


4

Ви можете заглянути в psh тут: http://gnp.github.io/psh/

Це повна оболонка (ви можете використовувати її замість bash, наприклад), але використовує синтаксис perl .. так що ви можете створювати методи на льоту тощо.


3

Під Debian / Ubuntu:

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

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

3

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


2

Оновлення: з тих пір я створив REPL, який можна завантажити, дивіться іншу відповідь .

З користю заднього огляду:

  • У третіх сторін рішення , згадані серед існуючих відповідей або громіздкі , щоб встановити і / або не працюють без нетривіальних, неочевидних додаткові кроки - деякі рішення , як видається, по крайней мере , наполовину занедбаний.
  • Корисна REPL потрібна бібліотека для читання рядків для підтримки редагування командних рядків клавіатури та підтримки історії - гарантуючи це проблемою для багатьох сторонніх рішень.
  • Якщо ви встановите 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читання та 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


0

Sepia та PDE також мають власні відповіді (для GNU Emacs).



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.