2010-09-07 6 views
6

Normalerweise verwende ich perl -de 42 für den Erhalt einer interaktiven Perl-Shell. Ich habe gesehen Devel::REPL und ich habe einige Blogs wie http://www.xenoterracide.com/2010/07/making-repl-usable.html zu sehen, wie Sie Devel::REPL mit den Plugins zu verbessern, aber ich habe noch nicht verwendet.Was sind die Nachteile der Verwendung des Perl-Debuggers gegen eine echte REPL wie Devel :: REPL?

Ist es zu schade, den Debugger als interaktive Shell zu verwenden? Warum?

Hinweis: die in diesem PerlMonks node erwähnten Nachteile waren Einschränkungen des Benutzers, nicht des Perl-Debuggers.

Wo kann ich mehr über Perl REPL lesen?

Ist Devel :: REPL bereit für das Rampenlicht?

UPDATE: ich die Pedros akzeptierte Antwort, weil es die Frage beantwortet, die ich fragte, aber immer noch würde Ich mag wissen, wann und warum (falls vorhanden) die Verwendung des Perl-Debugger als interaktiv Shell ist ein schlechte Idee im Vergleich zu einer der Perl-REPL-Implementierungen. Und welche Perl REPL bevorzugen Sie?

+0

Neben PDL2 (PDL interaktiv Shell, die Devel :: REPL unter der Haube verwendet) Ich habe eine andere REPL für Perl gesehen: [Carp :: REPL] (http: //search.cpan. org/perldoc? Carp :: REPL) –

Antwort

8

Ein Nachteil von perl -d ist, dass lexikalische Variablen sofort außerhalb des Geltungsbereichs gehen. Beispiel:

DB<1> my $p = 123; 

DB<2> print $p; 

DB<3> 

Von perldebug:

Beachten Sie, dass die genannte eval durch einen impliziten Umfang gebunden ist. Als Folge davon ist jede neue eingeführte lexikalische Variable oder irgendein modifizierter Capture-Puffer-Inhalt nach dem Test verloren. Der Debugger ist eine nette Umgebung, Perl zu lernen, aber wenn Sie interaktiv experimentieren mit Material, das in der gleichen Bereich sein sollte, stopfen Sie es in einem linescope, stopfen Sie es in einer Zeile.

+1

Nun, ich würde sagen, dass als Antwort auf die Frage "Was sind die Nachteile der Verwendung des Perl-Debugger vs eine echte REPL wie Devel :: REPL?", lexikalische Variablen nicht Arbeiten ist eine Antwort. Und tatsächlich verursacht es viele Probleme, nicht nur mit 5.10 Funktionen. Das wichtigste ist, * es ist keine echte REPL *; Sie können keine interaktive Entwicklung darauf machen. –

+0

ich benutze es immer ohne strikte und mit globalen Variablen. Ich mache keine großen Dinge, testet nur API-Objekt-Returns oder manipuliere Dateien und es ist einfacher, die oneliner in einer REPL als durch Versuch und Irrtum in der Shell zu entwerfen. auch sagen, dass mein Problem mit dem Umfang nicht die Variablen, aber die perl 05.10 Funktionen, die nicht verfügbar sind, weil das Problem Umfang (siehe http [Wie perl innerhalb des Debugger 5.10 Funktionen benutzen?]: // Stackoverflow. com/questions/3539710/How-to-Use-Perl-5-10-Features-Inside-the-Debugger) –

+0

aus der Sicht von _real REPL_ und wie ich die Frage formuliert hast du hast völlig Recht über die Variable Umfang. Aber das war eine Einschränkung, die ich bereits kannte und die meine normale interaktive Nutzung nicht beeinflusst. * In meinem Fall * ist das kein Problem, zu einer echten REPL zu wechseln, aber die perl5: 10 Funktionen * IS * nicht zu benutzen. Ich war mehr daran interessiert zu wissen, ob es Einschränkungen bei der Speichernutzung, Efizienz usw. gab. Ich habe deine Antwort noch nicht akzeptiert ;-) (obwohl es richtig ist), weil ich andere Antworten gewinnen wollte, die sich auf andere Unterschiede konzentrieren könnten mich. –

3

Anstatt den Debugger zu verwenden und auf Funktionen verzichten, neige ich dazu nur

perl -wnE'say eval()//[email protected]' 

I Devel :: REPL verwendet habe, zu verwenden und wie es, aber gerade habe nie mit ihm verwendet.

Ein Vorteil der Verwendung des Debuggers ist $DB::single=1 zu stoppen und Einzelschritt an einem bestimmten Punkt zu haben.

+0

Dank ysth ich diesen Trick nicht wusste, +1, weil schöne Möglichkeit ist, einen Rechner zu starten ;-) aber als eine interaktive Shell nicht sehr brauchbar ist: keine Geschichte, keine readline, keine "m" -Option zu sehen, welche Methoden Sie in einem Objekt aufrufen können, müssen Sie Data :: Dumper stattdessen x 1, x 2 usw., keine Tab-Erweiterung verwenden, um die Variablen zu sehen .... –

+2

@Pablo: [rlwrap] (http://utopia.knoware.nl/~hlub/rlwrap/#rlwrap) wirkt Wunder für Geschichte und Readline-Unterstützung. –

+0

@Pedro: Danke, das ist ein nettes Werkzeug zu wissen. –

1

Beide haben unterschiedliche Ziele. Der Debugger ist optimiert für Debugging ein bereits geschrieben Perl-Skript/Programm. Während ein primäres Ziel REPL ist, schnelle Sprachrückmeldung zur Verfügung zu stellen und ist für den Input der Entwickler (die Entwickler) optimiert.

Für z. Wenn ich die folgenden in der Perl-Debugger tun:

DB<1> for my $x (1..10) { 

Ich bekomme einen Missing right curly or square bracket at (eval 5)... Fehler.

Während bei Devel::REPL ermöglicht es mehrzeilige Eingabe:

$ for my $x (1..3) { 
> say $x; 
> } 
1 
2 
3 

ich Devel::REPL sehr empfehlen und mit dem zusätzlichen Plugins wird es ein praktisches Entwicklungswerkzeug neben Ihrem Editor zu laufen hat.

/I3az/

+0

Ich denke, dass mit den richtigen Plugins Devel :: REPL ein nettes Werkzeug wäre. Ist es besser, nur als '\ ' am Ende der laufenden Zeilen im Debugger zu treffen. –

+0

fand ich, dass PDL2 (die interaktive Shell für PDL) verwendet jetzt Devel :: REPL und viele Plugins laden: $ PDL2 Perldl2 Shell v0.004 Plugins Loaded: Befehle Completion CompletionDriver :: Keywords CompletionDriver :: LexEnv CompletionDriver :: Methods DDS Findvariable Geschichte Interrupt LexEnv Multiline :: PPI NiceSlice PDLCommands Pakete Printcontrol ReadLineHistory . NETT!! –

+0

Yes 'pdl2' verwendet' Devel :: REPL', wenn es installiert ist, ansonsten fällt es zurück zu 'perdl' (PDL's original REPL). 'PDL' und' Devel :: REPL' sind in der Tat eine nette Ehe !! – draegtun