Jak mogę uruchomić interaktywną konsolę dla Perla?

Odpowiedzi:

297

Możesz użyć debugera Perla w trywialnym programie, na przykład:

perl -de1

Alternatywnie jest aplikacja Perla na konsoli Alexis Sukrieh , ale jej nie używałem.

Daniel Papasian
źródło
27
Jeśli chcesz czegoś minimalnie użytecznego, rozważ dodanie rlwrap. $ rlwrap perl -d -e 1 Otrzymasz historię i spójny monit
albfan
control+ Lnie działa w tym interfejsie poleceń, jak powinienem odświeżyć ekran?
Zen
1
Z perspektywy czasu: odpowiedź Jána Sáreníka wydaje się być najlepszym rozwiązaniem od razu po wyjęciu z pudełka (być może trzeba będzie zainstalować rlwrap). Wszystkie rozwiązania REPL / konsoli innych firm, w tym perlconsole, są kłopotliwe w instalacji i często mają więcej ograniczeń.
mklement0
3
Niestety, perl -de1nie wydaje się wsparcia myzmiennych i skróty nie działają albo z jakiegoś powodu ...
Geremia
1
perlconsolenie cierpi z powodu tych problemów.
Geremia,
60

Matt Trout nie tylko napisał artykuł o REPL, ale napisał jeden - Devel :: REPL

Użyłem go trochę i działa dość dobrze i jest w trakcie aktywnego rozwoju.

BTW, nie mam pojęcia, dlaczego ktoś zmodyfikował osobę, która wspomniała o użyciu „perl -e” z konsoli. To nie jest tak naprawdę REPL, prawda, ale jest fantastycznie przydatne i używam go cały czas.

Dave Rolsky
źródło
Myślę, że założono, że nie rozumiem pytania. Chyba go trochę zmodyfikuję. ;-)
Jon Ericson
Od połowy 2015 r .: po prostu uruchomienie [sudo] cpan Devel::REPLnie działało dla mnie, ani na OSX 10.10 (Perl 5.18.2), ani na Ubuntu 14.04 (Perl 5.18.2): dostaję błędy w czasie wykonywania narzekające na brakujące moduły; zainstalowałem jeden, a potem zrezygnowałem po zgłoszeniu kolejnego brakującego modułu.
mklement0
@ mklement0 Istnieje ustawienie cpan do automatycznego pobierania i budowania wymaganych modułów. Może być konieczne włączenie tego ustawienia. Alternatywnie, lepszym rozwiązaniem może być aplikacja cpanminus o zerowej konfiguracji .
Rozgwiazda
@Starfish: Thanks; aby zaoszczędzić czas przyszłych czytelników (ponieważ wydaje się, że odpowiedź może być krótka): jak włączyć to ustawienie?
mklement0
1
Nawiasem mówiąc, re.plautor Matt Trout napisał artykuł wymieniający kilka alternatyw, a on sam sugeruje użycie replyzamiast re.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Denilson Sá Maia
36

Napisałem skrypt, który nazywam „psh”:

#! /usr/bin/perl

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

Cokolwiek wpiszesz, ocenia w Perlu:

> 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
źródło
4
Czy działa to tylko dla jednej linijki, czy może obsługiwać wieloliniowy kod Perla, taki jak rozgałęzienie warunkowe, pętle, instrukcje zagnieżdżone?
David
23

Jeśli chcesz historii, użyj rlwrap . Może to być ~/bin/ipsna przykład Twój :

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

A tak to wygląda:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 
Ján Sáreník
źródło
4
Wyrazy uznania za miłe podsumowanie - wsparcie readline jest potrzebne nie tylko do historii, ale także do edycji wiersza poleceń. Z wyjątkiem obsługi wielu linii, działa to dobrze; oto wersja alias jako alternatywę: alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'. Użytkowników OSX można zainstalować rlwrappoprzez Homebrew z brew install rlwrap.
mklement0
Oto wersja, która daje niezły wynik, gdy wyrażenie rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
przekształca
21

Myślę, że pytasz o interfejs REPL (odczyt, ocena, drukowanie, pętla) dla perla. Można to zrobić na kilka sposobów:

  • Matt Trout ma artykuł opisujący, jak go napisać
  • Adriano Ferreira opisał kilka opcji
  • wreszcie możesz wskoczyć na IRC na irc.perl.org i wypróbować jednego z eval botów na wielu popularnych kanałach. Będą oceniać fragmenty perla, które im przekażesz.
amoore
źródło
1
Artykuł Matta Trouta jest niedostępny
lepe
1
Matt Trout ma teraz o wiele bardziej aktualną listę REPL, które poleca: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic,
20

Używam wiersza polecenia jako konsoli:

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

Następnie mogę użyć mojej historii bashów, aby odzyskać stare polecenia. To jednak nie zachowuje stanu.

Ten formularz jest najbardziej przydatny, gdy chcesz przetestować „jedną małą rzecz” (na przykład odpowiadając na pytania Perla). Często okazuje się, że polecenia te są dosłownie zdrapywane do skryptu powłoki lub makefile.

Jon Ericson
źródło
1
W przypadku niektórych pocisków fishnawet nie potrzebujesz \n.
próbuje
15

Nie ma wbudowanej interaktywnej konsoli dla Perla, tak jak Python. Możesz jednak użyć Debugera Perla do debugowania powiązanych rzeczy. Włączasz ją z opcją -d, ale możesz chcieć sprawdzić „man perldebug”, aby się o tym dowiedzieć.

Po trochę googlingu, istnieje oddzielny projekt, który implementuje konsolę Perl, którą można znaleźć na http://www.sukria.net/perlconsole.html .

Mam nadzieję że to pomoże!

Frank Wiles
źródło
Dziwne, że ta odpowiedź nie otrzymała żadnych pozytywnych opinii, mimo że była wcześniejsza niż odpowiedź zaakceptowana i zawiera nieco więcej informacji. +1
Junuxx
14

Zawsze możesz po prostu wpaść do wbudowanego debuggera i uruchomić z niego polecenia.

   perl -d -e 1
Clinton Pierce
źródło
13

Istnieją dwa popularne Perl REPL.

  1. Devel :: REPL jest świetny.
  2. Ale odpowiedź IMO jest lepsza.
Eric Johnson
źródło
7
+1 za polecanie Odpowiedz. Sam autor Devel :: REPL polecił Odpowiedz nad swoim własnym rozwiązaniem, gdy pytam o dobry Perl REPL (konsola) na IRC. Odpowiedź zawiera również funkcję autouzupełniania, która jest bardzo przydatna do sprawdzania dostępnych metod i atrybutów obiektu. Mogę zainstalować Odpowiedź na Ubuntu za pomocą następującego polecenia: sudo apt-get install libreply-perl. Następnie można go uruchomić, wpisując replyterminal.
Apteryx
Jak zainstalować amd run Odpowiedz? Ani strona Metacpan, ani strona Github nie zawierają instrukcji.
Philippe
12

Stworzyłem perli, Perl REPL, który działa w systemie Linux, macOS i Windows .

Koncentruje się na automatycznym drukowaniu wyników, wygodnym wyszukiwaniu dokumentacji i łatwej kontroli dopasowań wyrażeń regularnych.
Można zobaczyć zdjęcia tutaj .

Działa autonomicznie (nie ma żadnych innych zależności niż sam Perl), ale zdecydowanie zaleca się instalację,rlwrap aby wesprzeć edycję wiersza poleceń, trwałą historię poleceń i uzupełnianie tabulatorów - czytaj więcej tutaj .

Instalacja

  • Jeśli akurat masz zainstalowany Node.js:

    npm install -g perli
  • Inaczej:

    • Unix -jak platformach: Pobierz ten skrypt jako perlido folderu w ścieżce systemu i uczynić go wykonywalnym z chmod +x.

    • Windows : Pobierz ten skrypt jako perli.pl(zwróć uwagę na .plrozszerzenie) do folderu na ścieżce systemu.
      Jeśli nie masz nic przeciwko inwokowaniu Perli jako perli.pl, wszystko jest gotowe.
      W przeciwnym razie utwórz plik wsadowy o nazwie perli.cmdw tym samym folderze o następującej treści @%~dpn.pl %*:; umożliwia to wywołanie jako słuszne perli.

mklement0
źródło
1
Podoba mi się, że można uruchomić perldocz perliREPL jak 'someCommand ?'. Wygląda na to, że od jakiegoś czasu nie był aktualizowany, czy nadal utrzymujesz Perli?
sdkks,
1
@sdkks: Jeśli znajdziesz problem, zgłoś go na GitHub, a ja postaram się go naprawić. perliod jakiegoś czasu nie był aktualizowany, ponieważ do mojego osobistego użytku nie natknąłem się na żadne problemy i wydaje się, że niewiele osób go używa, ale o ile wiem, nadal działa tak, jak reklamowano.
mklement0
7

Zawsze robiłem:

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

W wersji 5.10 zmieniłem na:

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

(rlwrap jest opcjonalny)

ysth
źródło
6

perl -d jest twoim przyjacielem:

% perl -de 0
Brian Phillips
źródło
5

Pętla do odczytu-odczytu-ewaluacji:

$ perl -e'while(<>){print eval,"\n"}'
KIM Taegyoon
źródło
4

Perl nie ma konsoli, ale debugger może być używany jako jeden. W wierszu polecenia wpisz perl -de 1. (Wartość „1” nie ma znaczenia, to tylko prawidłowe stwierdzenie, które nic nie robi.)

Istnieje również kilka opcji dla powłoki Perla .

Aby uzyskać więcej informacji, przeczytaj perlfaq3 .

Michael Carman
źródło
4

Możesz zajrzeć do psh tutaj: http://gnp.github.io/psh/

Jest pełny w powłoce (możesz go użyć na przykład zamiast basha), ale używa składni perla .. więc możesz tworzyć metody w locie itp.

Sheloo
źródło
3

W obszarze Debian / Ubuntu:

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

$ sudo apt-get install libapp-repl-perl
$ iperl
gavenkoa
źródło
3

Przegląd Matta Trouta wymienia pięć opcji, perl -de 0począwszy od tego , i zaleca Reply, jeśli rozszerzalność za pomocą wtyczek jest ważna, lub tinyreplod Eval::WithLexicals, dla minimalnego, czysto perlowego rozwiązania, które obejmuje wsparcie readline i trwałość leksykalną.

Davor Cubranic
źródło
2

Aktualizacja: Od tego czasu stworzyłem REPL do pobrania - patrz moja inna odpowiedź .

Z perspektywy czasu:

  • Rozwiązania innych firm wymienione wśród istniejących odpowiedzi są albo kłopotliwe w instalacji i / lub nie działają bez trywialnych, nieoczywistych dodatkowych kroków - niektóre rozwiązania wydają się być co najmniej w połowie zaniechane.
  • Użyteczna REPL potrzebuje biblioteki readline do obsługi klawiatury wiersza poleceń i obsługi historii - zapewniając to kłopot dla wielu rozwiązań innych firm.
  • Jeśli zainstalujesz CLI rlwrap, który zapewnia obsługę readline dla dowolnej komendy, możesz połączyć ją z prostą komendą Perla, aby utworzyć użyteczną REPL , a tym samym zrezygnować z rozwiązań REPL innych firm.
    • Na OSX można zainstalować rlwrappoprzez Homebrew z brew install rlwrap.
    • Dystrybucje systemu Linux powinny oferować rlwrapza pośrednictwem odpowiednich menedżerów pakietów; np. na Ubuntu, użyj sudo apt-get install rlwrap.
    • Zobacz odpowiedź Jána Sáreníka dla wspomnianej kombinacji rlwrappolecenia Perl.

Czego NIE otrzymujesz z odpowiedzią Jána:

  • automatyczne uzupełnianie
  • możliwość wprowadzania instrukcji wieloliniowych

Jedynym rozwiązaniem oferowanym przez inne firmy (z nietrywialną instalacją + dodatkowymi, nieoczywistymi krokami) jest psh , ale:

  • nie widziała aktywności od około 2,5 roku

  • Skupia różni się tym, że ma być pełnoprawnym wymiana powłoki , a tym samym działa jak tradycyjny skorupy, co oznacza, że nie automatycznie ocenić polecenia jako Perl rachunku i wymaga wyraźnej komendy wyjściowe, takie jak printna wypisz wynik wyrażenia.


Odpowiedź Jána Sáreníka można poprawić w jeden sposób:

  • Domyślnie drukuje tablice / listy / tablice skrótów jako skalary , tzn. Drukuje tylko liczbę elementów , podczas gdy przydatne byłoby wyliczenie ich elementów.

Jeśli Data::Printermoduł zostanie zainstalowany [sudo] cpan Data::Printerjako jednorazowa operacja, można załadować go do REPL w celu użycia p()funkcji, do której można przekazać listy / tablice / tablice skrótów do wyliczenia.

Oto alias o nazwie iperlreadline i Data::Printerwsparciu , który możesz umieścić w pliku inicjującym powłoki podobnym do POSIX (np. ~/.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()//$@'\'

Na przykład możesz wykonać następujące czynności, aby wydrukować wszystkie zmienne środowiskowe za pomocą tablicy hashtable %ENV:

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

Podobnie jak w przypadku odpowiedzi Jána, skalarny wynik wyrażenia jest automatycznie drukowany; na przykład:

iperl> 22 / 7  # automatically print scalar result of expression: 3.14285714285714
mklement0
źródło
0

Sepia i PDE mają również własne REPL (dla GNU Emacs).


źródło