Come posso avviare una console interattiva per Perl?


Risposte:


297

Puoi usare il debugger perl su un programma banale, in questo modo:

perl -de1

In alternativa c'è l' applicazione Perl Console di Alexis Sukrieh , ma non l'ho usata.


28
Se vuoi qualcosa di minimamente utilizzabile considera di aggiungere rlwrap $ rlwrap perl -d -e 1 Avresti la cronologia e un prompt coerente
albfan

control+ Lnon funziona con questa interfaccia di comando, come devo aggiornare lo schermo?
Zen,

1
Con il senno di poi: la risposta di Ján Sáreník sembra fornire la migliore soluzione quasi pronta all'uso (potrebbe essere necessario installare rlwrap). Tutte le soluzioni REPL / console di terze parti, incluso perlconsole, sono ingombranti da installare e spesso hanno più limitazioni.
mklement0

3
Sfortunatamente, perl -de1non sembra supportare le myvariabili e neanche gli hash funzionano, per qualche motivo ...
Geremia,

1
perlconsolenon soffre di questi problemi.
Geremia,

60

Matt Trout non solo ha scritto un articolo su un REPL, ma ne ha anche scritto uno - Develop :: REPL

L'ho usato un po 'e funziona abbastanza bene, ed è in fase di sviluppo attivo.

A proposito, non ho idea del perché qualcuno abbia modificato la persona che ha menzionato l'utilizzo di "perl -e" dalla console. Questo non è davvero un REPL, vero, ma è straordinariamente utile e lo uso sempre.


Penso che si presumesse di non aver capito la domanda. Immagino che lo modificherò un po '. ;-)
Jon Ericson,

A partire dalla metà del 2015: la semplice esecuzione [sudo] cpan Devel::REPLnon ha funzionato per me, né su OSX 10.10 (Perl 5.18.2) né su Ubuntu 14.04 (Perl 5.18.2): ho errori di runtime che si lamentano dei moduli mancanti; installato uno, quindi ha rinunciato dopo che è stato segnalato un altro modulo mancante.
mklement0

@ mklement0 Esiste un'impostazione cpan per scaricare e creare automaticamente i moduli prerequisiti. Potrebbe essere necessario attivare questa impostazione. In alternativa, l' applicazione cpanminus a configurazione zero può essere un'opzione migliore.
Stella di mare

@Starfish: grazie; per risparmiare tempo ai futuri lettori (poiché sembra che la risposta potrebbe essere breve): come si attiva questa impostazione?
mklement0

1
A proposito, Matt Trout, l' re.plautore, ha scritto un articolo in cui sono elencate diverse alternative, e lui stesso suggerisce di utilizzare replyinvece di re.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Denilson Sá Maia,

36

Ho scritto uno script che chiamo "psh":

#! /usr/bin/perl

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

Qualunque cosa tu digiti, valuta in 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
Funziona solo con un liner o può gestire codice Perl multilinea come branching condizionale, loop, istruzioni nidificate?
David,

23

Se vuoi la cronologia, usa rlwrap . Questo potrebbe essere il tuo ~/bin/ipsper esempio:

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

Ed è così che appare:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 

4
Complimenti per averlo ben confezionato: il supporto readline non è necessario solo per la cronologia, ma anche per la modifica della riga di comando. Con l'eccezione del supporto multilinea, questo funziona bene; ecco una versione alias come alternativa: alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'. Gli utenti OSX possono installare rlwraptramite Homebrew con brew install rlwrap.
mklement0

Ecco una versione che dà un buon risultato quando l'espressione restituisce un elenco o un riferimento:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
michau

21

Penso che tu stia chiedendo un'interfaccia REPL (Leggi, Valuta, Stampa, Loop) per Perl. Ci sono alcuni modi per farlo:

  • Matt Trout ha un articolo che descrive come scriverne uno
  • Adriano Ferreira ha descritto alcune opzioni
  • e infine, puoi salire su IRC su irc.perl.org e provare uno dei robot eval in molti dei canali popolari. Valuteranno i pezzi di perl che passi loro.

1
L'articolo di Matt Trout è in calo da alcuni anni, puoi trovarlo qui: web.archive.org/web/20100212100032/http://chainsawblues.vox.com/…
lepe

1
Matt Trout ora ha un elenco molto più aggiornato di REPL che raccomanda: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic

20

Uso la riga di comando come console:

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

Quindi posso usare la mia cronologia di bash per recuperare vecchi comandi. Ciò non preserva lo stato, tuttavia.

Questo modulo è molto utile quando si desidera testare "una piccola cosa" (come quando si risponde alle domande Perl). Spesso, trovo che questi comandi vengano raschiati alla lettera in uno script di shell o in un makefile.


1
Con alcune conchiglie, come fish, non hai nemmeno bisogno di \n.
trysis,

15

Non esiste una console interattiva per Perl come Python. È tuttavia possibile utilizzare il debugger Perl per eseguire operazioni di debug. Lo accendi con l'opzione -d, ma potresti voler controllare 'man perldebug' per saperne di più.

Dopo un po 'di ricerche su Google, c'è un progetto separato che implementa una console Perl che puoi trovare su http://www.sukria.net/perlconsole.html .

Spero che questo ti aiuti!


Strano che questa risposta non abbia ricevuto alcun voto, anche se era precedente alla risposta accettata e fornisce anche un po 'più di informazioni. +1
Junuxx,

14

Puoi sempre semplicemente accedere al debugger integrato ed eseguire i comandi da lì.

   perl -d -e 1

13

Esistono due REPL Perl popolari.

  1. Devel :: REPL è fantastico.
  2. Ma la risposta IMO è migliore.

7
+1 per raccomandare la risposta. Lo stesso autore di Develop :: REPL ha raccomandato Reply sulla propria soluzione quando chiedo di un buon Perl REPL (console) su IRC. Reply viene inoltre fornito con il completamento automatico molto utile per l'ispezione dei metodi e degli attributi disponibili di un oggetto. Ho potuto installare Rispondi su Ubuntu con il seguente comando: sudo apt-get install libreply-perl. Quindi può essere eseguito semplicemente digitando replyun terminale.
Apteryx,

Come si installa amd run Reply? Né Metacpan né la pagina Github forniscono istruzioni.
Philippe,

12

Ho creato perliun REPL Perl che funziona su Linux, macOS e Windows .

Il suo focus è la stampa automatica dei risultati, ricerche documentali convenienti e una facile ispezione delle corrispondenze di espressioni regolari.
Puoi vedere gli screenshot qui .

Funziona da solo (non ha dipendenze diverse dal Perl stesso), ma l' installazione di rlwrapè fortemente consigliata per supportare la modifica della riga di comando, la cronologia dei comandi persistenti e il completamento delle schede - leggi di più qui .

Installazione

  • Se hai Node.js installato:

    npm install -g perli
  • Altrimenti:

    • Piattaforme simili a Unix : scarica questo script come perliin una cartella nel percorso del tuo sistema e rendilo eseguibile con chmod +x.

    • Windows : scarica questo script come perli.pl(nota l' .plestensione) in una cartella nel percorso del tuo sistema.
      Se non ti dispiace invocare Perli come perli.pl, sei pronto.
      In caso contrario, creare un file batch denominato perli.cmdnella stessa cartella con il seguente contenuto @%~dpn.pl %*:; questo abilita l'invocazione come giusta perli.


1
Mi piace che possa essere avviato perldocda perliREPL come 'someCommand ?'. Sembra che non sia stato aggiornato per un po ', stai ancora mantenendo Perli?
sdkks,

1
@sdkks: se trovi un problema, segnalalo su GitHub e proverò a risolverlo. perlinon è stato aggiornato da un po ', perché nel mio uso personale non ho riscontrato alcun problema e poche altre persone sembrano usarlo, ma, per quanto ne so, funziona ancora come pubblicizzato.
mklement0,

7

Ho sempre fatto:

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

Con 5.10 sono passato a:

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

(rlwrap è opzionale)



6

re.pl di Devel :: REPL



4

Perl non ha una console ma il debugger può essere usato come uno. Al prompt dei comandi, digitare perl -de 1. (Il valore "1" non ha importanza, è solo un'istruzione valida che non fa nulla.)

Ci sono anche un paio di opzioni per una shell Perl .

Per maggiori informazioni leggi perlfaq3 .


4

Puoi consultare psh qui: http://gnp.github.io/psh/

È una shell completa (puoi usarla in sostituzione di bash per esempio), ma usa la sintassi perl .. in modo da poter creare metodi al volo ecc.


3

Sotto Debian / Ubuntu:

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

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

3

La panoramica di Matt Trout elenca cinque scelte, da in perl -de 0poi, e raccomanda Reply, se è importante l'estensibilità tramite plug-in, o tinyreplda Eval::WithLexicals, per una soluzione minima, perl puro che includa il supporto readline e la persistenza lessicale.


2

Aggiornamento: da allora ho creato un REPL scaricabile - vedi la mia altra risposta .

Con il senno di poi:

  • Le soluzioni di terze parti citate tra le risposte esistenti sono o ingombranti da installare e / o non funzionano senza passaggi aggiuntivi non banali, non ovvi - alcune soluzioni sembrano essere almeno semi-abbandonate.
  • Un REPL utilizzabile richiede la libreria readline per il supporto della tastiera per la modifica della riga di comando e il supporto della cronologia , garantendo che questo sia un punto problematico per molte soluzioni di terze parti.
  • Se si installa CLI rlwrap, che fornisce supporto readline a qualsiasi comando, è possibile combinarlo con un semplice comando Perl per creare un REPL utilizzabile e quindi fare a meno di soluzioni REPL di terze parti.
    • Su OSX, è possibile installare rlwraptramite Homebrew conbrew install rlwrap .
    • Le distro Linux dovrebbero offrire rlwraptramite i rispettivi gestori di pacchetti; ad esempio, su Ubuntu, utilizzare sudo apt-get install rlwrap.
    • Vedi la risposta di Ján Sáreník per detta combinazione di rlwrape un comando Perl.

Quello che NON ottieni dalla risposta di Ján:

  • completamento automatico
  • possibilità di inserire istruzioni multilinea

L'unica soluzione di terze parti che offre questi (con installazione non banale + passaggi aggiuntivi, non ovvi), è psh , ma:

  • non ha visto attività da circa 2,5 anni

  • il suo obiettivo è diverso in quanto mira ad essere una vera e propria shell sostituzione , e pertanto funziona come un guscio tradizionale, il che significa che non valuta automaticamente un comando come Perl dichiarazione, e richiede un esplicito comando di output come printda stampa il risultato di un'espressione.


La risposta di Ján Sáreník può essere migliorata in un modo:

  • Per impostazione predefinita, stampa matrici / liste / hashtabili come scalari , ovvero stampa solo il conteggio degli elementi , mentre sarebbe utile invece enumerare i loro elementi.

Se si installa il Data::Printermodulo con [sudo] cpan Data::Printerun'unica operazione, è possibile caricarlo nel REPL per l'uso della p()funzione, a cui è possibile passare elenchi / matrici / hashtable per l'enumerazione.

Ecco un alias chiamato iperlcon readline e Data::Printersupporto , che puoi inserire nel file di inizializzazione della shell simile a POSIX (ad es. ~/.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()//$@'\'

Ad esempio, è possibile eseguire le seguenti operazioni per stampare tutte le variabili di ambiente tramite la tabella hash %ENV:

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

Come per la risposta di Ján, il risultato scalare di un'espressione viene automaticamente stampato; per esempio:

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


0

Sepia e PDE hanno anche REPL propri (per GNU Emacs).



Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.