Wie kann ich eine interaktive Konsole für Perl starten?

Antworten:

297

Sie können den Perl-Debugger in einem einfachen Programm verwenden, wie folgt:

perl -de1

Alternativ gibt es die Perl Console- Anwendung von Alexis Sukrieh , die ich jedoch nicht verwendet habe.

Daniel Papasian
quelle
27
Wenn Sie etwas minimal Verwendbares wollen, sollten Sie rlwrap hinzufügen . $ rlwrap perl -d -e 1 Sie erhalten Verlauf und eine konsistente Eingabeaufforderung
albfan
control+ Lfunktioniert unter dieser Befehlsoberfläche nicht. Wie soll ich den Bildschirm aktualisieren?
Zen
1
Im Nachhinein scheint die Antwort von Ján Sáreník die beste, fast sofort einsatzbereite Lösung zu sein (möglicherweise müssen Sie sie installieren rlwrap). Alle REPL / Konsolen-Lösungen von Drittanbietern, einschließlich perlconsole, sind umständlich zu installieren und weisen häufig weitere Einschränkungen auf.
mklement0
3
Leider perl -de1scheint es keine myVariablen zu unterstützen , und Hashes funktionieren aus irgendeinem Grund auch nicht…
Geremia
1
perlconsoleleidet nicht unter diesen Problemen.
Geremia
60

Matt Trout hat nicht nur einen Artikel über eine REPL geschrieben, sondern auch einen - Devel :: REPL

Ich habe es ein bisschen benutzt und es funktioniert ziemlich gut und es befindet sich in der aktiven Entwicklung.

Übrigens habe ich keine Ahnung, warum jemand die Person, die "perl -e" erwähnt hat, von der Konsole herunter modifiziert hat. Das ist zwar nicht wirklich eine REPL, aber es ist fantastisch nützlich und ich benutze es die ganze Zeit.

Dave Rolsky
quelle
Ich glaube, es wurde angenommen, dass ich die Frage nicht verstanden habe. Ich denke, ich werde es ein bisschen bearbeiten. ;-)
Jon Ericson
Ab Mitte 2015: Das einfache Ausführen [sudo] cpan Devel::REPLhat bei mir weder unter OSX 10.10 (Perl 5.18.2) noch unter Ubuntu 14.04 (Perl 5.18.2) funktioniert: Ich erhalte Laufzeitfehler, wenn ich mich über fehlende Module beschwere. installiert ein, dann aufgegeben, nachdem ein anderes fehlendes Modul gemeldet wurde.
mklement0
@ mklement0 Es gibt eine cpan-Einstellung zum automatischen Herunterladen und Erstellen der erforderlichen Module. Möglicherweise müssen Sie diese Einstellung aktivieren. Alternativ kann die Zero-Config- Anwendung cpanminus eine bessere Option sein.
Seestern
@ Starfish: Danke; um zukünftigen Lesern Zeit zu sparen (da die Antwort möglicherweise kurz ist): Wie aktivieren Sie diese Einstellung?
mklement0
1
Übrigens, Matt Trout, der re.plAutor, schrieb einen Artikel, in dem mehrere Alternativen aufgeführt sind, und er selbst schlägt vor, replyanstelle von re.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Denilson Sá Maia
36

Ich habe ein Skript geschrieben, das ich "psh" nenne:

#! /usr/bin/perl

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

Was auch immer Sie eingeben, es wird in Perl ausgewertet:

> 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
quelle
4
Funktioniert dies nur für einen Liner oder kann mehrzeiliger Perl-Code wie bedingte Verzweigung, Schleifen, verschachtelte Anweisungen verarbeitet werden?
David
23

Wenn Sie einen Verlauf wünschen, verwenden Sie rlwrap . Dies könnte Ihr ~/bin/ipsBeispiel sein:

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

Und so sieht es aus:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 
Ján Sáreník
quelle
4
Ein großes Lob für die gute Zusammenfassung - Readline-Unterstützung wird nicht nur für den Verlauf, sondern auch für die Bearbeitung der Befehlszeile benötigt. Mit Ausnahme der Unterstützung für mehrere Leitungen funktioniert dies gut. Hier ist eine Alias-Version als Alternative : alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'. OSX-Benutzer können rlwrapüber Homebrew mit installieren brew install rlwrap.
mklement0
Hier ist eine Version, die eine schöne Ausgabe liefert, wenn der Ausdruck eine Liste oder eine Referenz rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
ergibt
21

Ich denke, Sie fragen nach einer REPL-Schnittstelle (Read, Evaluate, Print, Loop) für Perl. Es gibt einige Möglichkeiten, dies zu tun:

  • Matt Trout hat einen Artikel , der beschreibt, wie man einen schreibt
  • Adriano Ferreira hat einige Optionen beschrieben
  • und schließlich können Sie im IRC unter irc.perl.org einen der Eval-Bots in vielen der beliebten Kanäle ausprobieren. Sie bewerten Perl-Stücke, die Sie an sie weitergeben.
amoore
quelle
1
Der Artikel von Matt Trout ist seit einigen Jahren nicht mehr verfügbar.
lepe
1
Matt Trout hat jetzt eine weitaus aktuellere Liste von REPLs, die er empfiehlt: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic
20

Ich benutze die Kommandozeile als Konsole:

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

Dann kann ich meine Bash benutzen Verlauf verwenden, um alte Befehle zurückzugewinnen. Dies bewahrt jedoch nicht den Zustand.

Dieses Formular ist am nützlichsten, wenn Sie "eine Kleinigkeit" testen möchten (z. B. bei der Beantwortung von Perl-Fragen). Oft finde ich, dass diese Befehle wörtlich in ein Shell-Skript oder Makefile geschrieben werden.

Jon Ericson
quelle
1
Mit einigen Muscheln fishbrauchen Sie nicht einmal die \n.
Tryse
15

Es gibt keine interaktive Konsole für Perl wie Python. Sie können jedoch den Perl-Debugger verwenden, um verwandte Dinge zu debuggen. Sie aktivieren es mit der Option -d, möchten jedoch möglicherweise 'man perldebug' überprüfen, um mehr darüber zu erfahren.

Nach einigem googeln gibt es ein separates Projekt, das eine Perl-Konsole implementiert, die Sie unter finden http://www.sukria.net/perlconsole.html .

Hoffe das hilft!

Frank Wiles
quelle
Seltsam, dass diese Antwort keine positiven Stimmen erhalten hat, obwohl sie früher als die akzeptierte Antwort war und auch ein bisschen mehr Informationen liefert. +1
Junuxx
14

Sie können jederzeit einfach in den integrierten Debugger wechseln und von dort aus Befehle ausführen.

   perl -d -e 1
Clinton Pierce
quelle
13

Es gibt zwei beliebte Perl-REPLs.

  1. Devel :: REPL ist großartig.
  2. Aber IMO Reply ist besser.
Eric Johnson
quelle
7
+1 für die Empfehlung von Antworten. Der Autor von Devel :: REPL selbst hat Reply über seine eigene Lösung empfohlen, wenn ich nach einer guten Perl REPL (Konsole) im IRC frage. Die Antwort wird auch mit einer automatischen Vervollständigung geliefert, die sehr praktisch ist, um die verfügbaren Methoden und Attribute eines Objekts zu überprüfen. Ich könnte Reply unter Ubuntu mit dem folgenden Befehl installieren : sudo apt-get install libreply-perl. Dann kann es ausgeführt werden, indem einfach replyein Terminal eingegeben wird.
Apteryx
Wie installiere ich amd run Reply? Weder die Metacpan- noch die Github-Seite enthalten Anweisungen.
Philippe
12

Ich habe perlieine Perl-REPL erstellt , die unter Linux, MacOS und Windows ausgeführt wird .

Der Schwerpunkt liegt auf dem automatischen Drucken von Ergebnissen, der praktischen Suche nach Dokumentationen und der einfachen Überprüfung von Übereinstimmungen mit regulären Ausdrücken.
Sie können Screenshots sehen hier .

Es funktioniert eigenständig (hat keine anderen Abhängigkeiten als Perl selbst), aber die Installation von rlwrapwird dringend empfohlen , um die Befehlszeilenbearbeitung, den dauerhaften Befehlsverlauf und die Vervollständigung von Registerkarten zu unterstützen - lesen Sie hier mehr .

Installation

  • Wenn Sie Node.js installiert haben:

    npm install -g perli
  • Andernfalls:

    • Unix - ähnliche Plattformen: Laden Sie dieses Skript als perliin einen Ordner im Pfad Ihres Systems und ausführbar machen mit chmod +x.

    • Windows : Laden Sie dieses Skript als perli.pl(beachten Sie die .plErweiterung) in einen Ordner im Pfad Ihres Systems herunter .
      Wenn es Ihnen nichts ausmacht, Perli als aufzurufen perli.pl, sind Sie fertig.
      Andernfalls erstellen Sie eine Batchdatei perli.cmdmit demselben Namen und folgendem Inhalt : @%~dpn.pl %*; Dies ermöglicht den Aufruf als gerecht perli.

mklement0
quelle
1
Ich mag es kann perldocvon perliREPL wie starten 'someCommand ?'. Sieht so aus, als wäre es eine Weile nicht aktualisiert worden. Behalten Sie immer noch Perli bei?
SDKKS
1
@sdkks: Wenn Sie ein Problem finden, melden Sie es auf GitHub und ich werde versuchen, es zu beheben. perliwurde seit einiger Zeit nicht mehr aktualisiert, da ich in meinem persönlichen Gebrauch keine Probleme festgestellt habe und nur wenige andere Leute es zu verwenden scheinen, aber soweit ich weiß, funktioniert es immer noch wie angekündigt.
mklement0
7

Ich habe es immer getan:

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

Mit 5.10 habe ich gewechselt zu:

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

(rlwrap ist optional)

ysth
quelle
6

perl -d ist dein Freund:

% perl -de 0
Brian Phillips
quelle
6

re.pl von Devel :: REPL


quelle
5

Read-Eval-Print-Schleife:

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

Perl hat keine Konsole, aber der Debugger kann als eine verwendet werden. Geben Sie an einer Eingabeaufforderung ein perl -de 1. (Der Wert "1" spielt keine Rolle, es ist nur eine gültige Aussage, die nichts bewirkt.)

Es gibt auch einige Optionen für eine Perl-Shell .

Weitere Informationen finden Sie in perlfaq3 .

Michael Carman
quelle
4

Sie können sich psh hier ansehen: http://gnp.github.io/psh/

Es ist eine Full-On-Shell (Sie können sie beispielsweise als Ersatz für Bash verwenden), verwendet jedoch die Perl-Syntax. So können Sie Methoden im laufenden Betrieb erstellen.

Shelfoo
quelle
3

Unter Debian / Ubuntu:

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

$ sudo apt-get install libapp-repl-perl
$ iperl
Gavenkoa
quelle
3

Matt Trout Übersicht listet fünf Auswahlmöglichkeiten, aus perl -de 0ab, und er empfiehlt Reply, wenn Erweiterbarkeit über Plugins wichtig ist, oder tinyreplaus Eval::WithLexicals, für eine minimale, pure-perl - Lösung , die Readline- Unterstützung und lexikalische Ausdauer enthält.

Davor Cubranic
quelle
2

Update: Ich habe seitdem eine herunterladbare REPL erstellt - siehe meine andere Antwort .

Im Nachhinein:

  • Die in den vorhandenen Antworten genannten Lösungen von Drittanbietern sind entweder umständlich zu installieren und / oder funktionieren nicht ohne nicht triviale, nicht offensichtliche zusätzliche Schritte - einige Lösungen scheinen mindestens zur Hälfte aufgegeben zu sein.
  • Eine verwendbare REPL benötigt die Readline-Bibliothek für die Unterstützung der Tastatur- und Verlaufsbearbeitung über die Befehlszeilenbearbeitung - um sicherzustellen, dass dies für viele Lösungen von Drittanbietern ein Problem darstellt.
  • Wenn Sie die CLI installieren rlwrap, die Readline-Unterstützung für jeden Befehl bietet, können Sie sie mit einem einfachen Perl-Befehl kombinieren, um eine verwendbare REPL zu erstellen , und somit auf REPL-Lösungen von Drittanbietern verzichten.
    • Unter OSX können Sie rlwrapüber Homebrew mit installieren brew install rlwrap.
    • Linux-Distributionen sollten rlwrapüber ihre jeweiligen Paketmanager anbieten ; zB unter Ubuntu verwenden sudo apt-get install rlwrap.
    • Siehe Ján Sáreníks Antwort für diese Kombination aus rlwrapund einem Perl-Befehl.

Was Sie mit Jáns Antwort NICHT bekommen :

  • automatische Vervollständigung
  • Möglichkeit zur Eingabe mehrzeiliger Anweisungen

Die einzige Lösung von Drittanbietern, die diese anbietet (mit nicht trivialer Installation + zusätzlichen, nicht offensichtlichen Schritten), ist psh , aber:

  • Es hat seit ungefähr 2,5 Jahren keine Aktivität mehr gesehen

  • sein Fokus ist anders, dass es zielt darauf ab , ein vollwertiges zu sein Shell - Ersatz , und so funktioniert wie eine herkömmliche Schale, was bedeutet , dass sie nicht automatisch einen Befehl als zu bewerten sind Perl - Anweisung und erfordert einen expliziten Ausgabebefehl wie printzu Drucken Sie das Ergebnis eines Ausdrucks.


Ján Sáreníks Antwort kann auf eine Weise verbessert werden:

  • Standardmäßig werden Arrays / Listen / Hashtabellen als Skalare gedruckt, dh nur deren Anzahl der Elemente , während es praktisch wäre, stattdessen ihre Elemente aufzulisten.

Wenn Sie das Data::PrinterModul mit installieren[sudo] cpan Data::Printer einmalig , können Sie es zur Verwendung der Funktion in die REPL laden p(), an die Sie Listen / Arrays / Hashtabellen zur Aufzählung übergeben können.

Hier ist ein Alias iperlmit Readline und Data::PrinterUnterstützung , den Sie in die Initialisierungsdatei Ihrer POSIX-ähnlichen Shell einfügen können (z. B. ~/.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()//$@'\'

Sie können dann beispielsweise Folgendes tun, um alle Umgebungsvariablen über die Hashtabelle zu drucken %ENV:

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

Wie bei Jáns Antwort wird das skalare Ergebnis eines Ausdrucks automatisch gedruckt. z.B:

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

Sepia und PDE haben auch eigene REPLs (für GNU Emacs).


quelle