¿Cómo puedo iniciar una consola interactiva para Perl?

Respuestas:

297

Puede usar el depurador perl en un programa trivial, de esta manera:

perl -de1

Alternativamente, está la aplicación Perl Console de Alexis Sukrieh , pero no la he usado.

Daniel Papasian
fuente
28
Si quieres algo minimimaly útil considerar añadir rlwrap $ rlwrap perl -d -e 1 Obtendría historia y un indicador consistente
albfan
control+ Lno funciona bajo esta interfaz de comando, ¿cómo debo actualizar la pantalla?
Zen
1
Con el beneficio de la retrospectiva: la respuesta de Ján Sáreník parece proporcionar la mejor solución casi lista para usar (puede que tenga que instalarla rlwrap). Todas las soluciones de REPL / consola de terceros, incluidas perlconsole, son difíciles de instalar y a menudo tienen más limitaciones.
mklement0
3
Desafortunadamente, perl -de1no parece admitir myvariables, y los hash tampoco funcionan, por alguna razón ...
Geremia
1
perlconsoleno sufre de estos problemas.
Geremia
60

Matt Trout no solo escribió un artículo sobre un REPL, sino que también escribió uno - Devel :: REPL

Lo he usado un poco y funciona bastante bien, y está en desarrollo activo.

Por cierto, no tengo idea de por qué alguien modificó a la persona que mencionó el uso de "perl -e" de la consola. Esto no es realmente un REPL, cierto, pero es fantásticamente útil, y lo uso todo el tiempo.

Dave Rolsky
fuente
Creo que se asumió que no entendía la pregunta. Supongo que lo editaré un poco. ;-)
Jon Ericson
A mediados de 2015: Simplemente ejecutar [sudo] cpan Devel::REPLno funcionó para mí, ni en OSX 10.10 (Perl 5.18.2) ni en Ubuntu 14.04 (Perl 5.18.2): recibo errores de tiempo de ejecución quejándose de módulos faltantes; instaló uno, luego se dio por vencido después de que se informó de otro módulo faltante.
mklement0
@ mklement0 Hay una configuración de cpan para descargar y crear módulos de requisitos previos automáticamente. Es posible que deba activar esa configuración. Alternativamente, la aplicación cpanminus de configuración cero puede ser una mejor opción.
Starfish
@ Starfish: Gracias; para ahorrar tiempo a los futuros lectores (ya que parece que la respuesta puede ser corta): ¿cómo se activa esta configuración?
mklement0
1
Por cierto, Matt Trout, el re.plautor, escribió un artículo que enumera varias alternativas, y él mismo sugiere usar en replylugar de re.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Denilson Sá Maia
36

Escribí un script que llamo "psh":

#! /usr/bin/perl

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

Cualquier cosa que escriba, se evalúa en 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
raldi
fuente
44
¿Funciona solo para un revestimiento o puede manejar código Perl multilínea como ramificaciones condicionales, bucles, declaraciones anidadas?
David
23

Si quieres historia, usa rlwrap . Este podría ser tu ~/bin/ipspor ejemplo:

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

Y así es como se ve:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 
Ján Sáreník
fuente
44
Felicitaciones por resumirlo bien: el soporte de readline no solo es necesario para el historial, sino también para editar la línea de comandos. Con la excepción del soporte multilínea, esto funciona bien; aquí está una versión de alias como alternativa: alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'. Los usuarios de OSX pueden instalar a rlwraptravés de Homebrew con brew install rlwrap.
mklement0
Aquí hay una versión que da un buen resultado cuando la expresión se evalúa como una lista o una referencia:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
michau
21

Creo que está preguntando acerca de una interfaz REPL (Leer, Evaluar, Imprimir, Bucle) para perl. Hay algunas formas de hacer esto:

  • Matt Trout tiene un artículo que describe cómo escribir uno
  • Adriano Ferreira ha descrito algunas opciones
  • y, por último, puede utilizar IRC en irc.perl.org y probar uno de los bots de evaluación en muchos de los canales populares. Evaluarán trozos de perl que les pases.
amoore
fuente
1
El artículo de Matt Trout ha estado caído desde hace algunos años, puede encontrarlo aquí: web.archive.org/web/20100212100032/http://chainsawblues.vox.com/…
lepe
1
Matt Trout ahora tiene una lista mucho más actualizada de REPL que recomienda: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic el
20

Yo uso la línea de comando como consola:

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

Entonces puedo usar mi historial de bash para recuperar comandos antiguos. Sin embargo, esto no preserva el estado.

Este formulario es más útil cuando desea evaluar "una pequeña cosa" (como cuando responde preguntas de Perl). A menudo, encuentro que estos comandos se raspan literalmente en un script de shell o un archivo MAKE.

Jon Ericson
fuente
1
Con algunos proyectiles, como fish, ni siquiera necesitas el \n.
trysis
15

No hay una consola interactiva para Perl integrada como lo hace Python. Sin embargo, puede usar el depurador de Perl para hacer cosas relacionadas con la depuración. Lo activa con la opción -d, pero es posible que desee consultar 'man perldebug' para obtener más información.

Después de buscar un poco en Google, hay un proyecto separado que implementa una consola Perl que puede encontrar en http://www.sukria.net/perlconsole.html .

¡Espero que esto ayude!

Frank Wiles
fuente
Es extraño que esta respuesta no haya recibido ningún voto positivo, a pesar de que fue anterior a la respuesta aceptada y también proporciona un poco más de información. +1
Junuxx
14

Siempre puede ingresar al depurador incorporado y ejecutar comandos desde allí.

   perl -d -e 1
Clinton Pierce
fuente
13

Hay dos REPLs populares de Perl.

  1. Devel :: REPL es genial.
  2. Pero IMO Reply es mejor.
Eric Johnson
fuente
77
+1 por recomendar la respuesta. El propio autor de Devel :: REPL me recomendó responder sobre su propia solución cuando le pregunto acerca de una buena Perl REPL (consola) en IRC. La respuesta también viene con autocompletado que es muy útil para inspeccionar los métodos y atributos disponibles de un objeto. Podría instalar Responder en Ubuntu con el siguiente comando: sudo apt-get install libreply-perl. Luego se puede ejecutar simplemente escribiendo replyen una terminal.
Apteryx
¿Cómo instalas amd run Reply? Ni la página de Metacpan ni la de Github proporcionan instrucciones.
Philippe
12

He creado perliun REPL de Perl que se ejecuta en Linux, macOS y Windows .

Su enfoque es la impresión automática de resultados, búsquedas de documentación convenientes y una fácil inspección de coincidencias de expresiones regulares.
Puedes ver capturas de pantalla aquí .

Funciona de forma independiente (no tiene otras dependencias que no sea Perl), pero se recomienda encarecidamente la instalaciónrlwrap para admitir la edición de línea de comandos, el historial de comandos persistente y la finalización de pestañas. Lea más aquí .

Instalación

  • Si tiene instalado Node.js:

    npm install -g perli
  • De otra manera:

    • Unix -como plataformas: Descargar este script como perlia una carpeta en el camino de su sistema y que sea ejecutable con chmod +x.

    • Windows : descargue este script como perli.pl(tenga en cuenta la .plextensión) a una carpeta en la ruta de su sistema.
      Si no te importa invocar a Perli como perli.pl, estás listo.
      De lo contrario, cree un archivo por lotes denominado perli.cmden la misma carpeta con el siguiente contenido @%~dpn.pl %*:; Esto permite la invocación como justa perli.

mklement0
fuente
1
Me gusta se puede iniciar perldocdesde perliREPL como 'someCommand ?'. Sin embargo, parece que no se ha actualizado durante un tiempo, ¿sigues manteniendo Perli?
sdkks
1
@sdkks: Si encuentra un problema, infórmelo en GitHub e intentaré solucionarlo. perlino se ha actualizado en mucho tiempo, porque en mi uso personal no he encontrado ningún problema, y ​​pocas personas parecen usarlo, pero, por lo que sé, todavía funciona como se anuncia.
mklement0
7

Siempre hice:

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

Con 5.10, me cambié a:

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

(rlwrap es opcional)

ysth
fuente
6

perl -d es tu amigo:

% perl -de 0
Brian Phillips
fuente
6

re.pl de Devel :: REPL


fuente
5

Leer-evaluar-imprimir bucle:

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

Perl no tiene una consola, pero el depurador puede usarse como uno. En el símbolo del sistema, escriba perl -de 1. (El valor "1" no importa, es solo una declaración válida que no hace nada).

También hay un par de opciones para un shell Perl .

Para obtener más información, lea perlfaq3 .

Michael Carman
fuente
4

Puede consultar psh aquí: http://gnp.github.io/psh/

Es un shell completo (puede usarlo en reemplazo de bash, por ejemplo), pero usa la sintaxis perl ... para que pueda crear métodos sobre la marcha, etc.

Shelfoo
fuente
3

Bajo Debian / Ubuntu:

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

$ sudo apt-get install libapp-repl-perl
$ iperl
gavenkoa
fuente
3

La descripción general de Matt Trout enumera cinco opciones, en perl -de 0adelante, y recomienda Reply, si la extensibilidad a través de complementos es importante, o tinyreplde Eval::WithLexicals, para una solución mínima, puramente perl que incluye soporte de línea de lectura y persistencia léxica.

Davor Cubranic
fuente
2

Actualización: desde entonces he creado un REPL descargable - vea mi otra respuesta .

Con el beneficio de la retrospectiva:

  • Las soluciones de terceros mencionadas entre las respuestas existentes son difíciles de instalar y / o no funcionan sin pasos adicionales no triviales ni obvios ; algunas soluciones parecen estar al menos medio abandonadas.
  • Un REPL utilizable necesita la biblioteca de línea de lectura para el soporte del teclado de edición de línea de comandos y el soporte del historial , lo que garantiza que este sea un punto problemático para muchas soluciones de terceros.
  • Si instala CLI rlwrap, que proporciona soporte de línea de lectura a cualquier comando, puede combinarlo con un simple comando Perl para crear un REPL utilizable y, por lo tanto, prescindir de soluciones REPL de terceros.
    • En OSX, puede instalar a rlwraptravés de Homebrew con brew install rlwrap.
    • Las distribuciones de Linux deben ofrecer a rlwraptravés de sus respectivos administradores de paquetes; por ejemplo, en Ubuntu, use sudo apt-get install rlwrap.
    • Vea la respuesta de Ján Sáreník para dicha combinación de rlwrapy un comando Perl.

Lo que NO obtienes con la respuesta de Ján:

  • autocompletado
  • capacidad de ingresar declaraciones de varias líneas

La única solución de terceros que ofrece estos (con instalación no trivial + pasos adicionales, no obvios), es psh , pero:

  • no ha visto actividad en alrededor de 2.5 años

  • su enfoque es diferente, ya que pretende ser un hecho y derecho Shell sustitución , y por lo tanto funciona como una concha tradicional, lo que significa que no se evalúa automáticamente un comando como Perl declaración, y requiere un comando de salida explícita como printa imprime el resultado de una expresión.


La respuesta de Ján Sáreník se puede mejorar de una manera:

  • De manera predeterminada, imprime matrices / listas / tablas hash como escalares , es decir, solo imprime su recuento de elementos , mientras que sería útil enumerar sus elementos en su lugar.

Si instala el Data::Printermódulo [sudo] cpan Data::Printercomo una operación única, puede cargarlo en el REPL para usar la p()función, a la que puede pasar listas / matrices / tablas hash para su enumeración.

Aquí hay un alias llamado iperlreadline y Data::Printersoporte , que puede poner en el archivo de inicialización de su shell POSIX (por ejemplo, ~/.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()//$@'\'

Por ejemplo, puede hacer lo siguiente para imprimir todas las variables de entorno a través de la tabla hash %ENV:

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

Al igual que con la respuesta de Ján, el resultado escalar de una expresión se imprime automáticamente ; p.ej:

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

Sepia y PDE también tienen REPL propios (para GNU Emacs).


fuente