Como posso iniciar um console interativo para Perl?

Respostas:

297

Você pode usar o depurador perl em um programa trivial, assim:

perl -de1

Como alternativa, há o aplicativo Perl Console de Alexis Sukrieh , mas eu não o usei.

Daniel Papasian
fonte
27
Se você quer algo minimimaly utilizável considerar adicionar rlwrap $ rlwrap perl -d -e 1 Você poderia obter história e um prompt consistente
albfan
control+ Lnão funciona nessa interface de comando, como devo atualizar a tela?
Zen
1
Com o benefício da retrospectiva: a resposta de Ján Sáreník parece fornecer a melhor solução pronta para uso imediato (talvez você precise instalar rlwrap). Todas as soluções REPL / console de terceiros, inclusive perlconsole, são difíceis de instalar e geralmente têm mais limitações.
precisa saber é o seguinte
3
Infelizmente, perl -de1não parece apoio myvariáveis, e hashes não quer trabalhar, por alguma razão ...
Geremia
1
perlconsolenão sofre com esses problemas.
Geremia
60

Matt Trout não apenas escreveu um artigo sobre um REPL, como também escreveu um - Devel :: REPL

Eu usei um pouco e funciona bastante bem, e está em desenvolvimento ativo.

BTW, não tenho idéia por que alguém modificou a pessoa que mencionou usar "perl -e" no console. Isso não é realmente um REPL, é verdade, mas é fantasticamente útil, e eu o uso o tempo todo.

Dave Rolsky
fonte
Eu acho que foi assumido que eu não entendi a pergunta. Acho que vou editar um pouco. ;-)
Jon Ericson
A partir de meados de 2015: A simples execução [sudo] cpan Devel::REPLnão funcionou para mim, nem no OSX 10.10 (Perl 5.18.2) nem no Ubuntu 14.04 (Perl 5.18.2): Eu recebo erros de tempo de execução reclamando da falta de módulos; instalou um e desistiu depois que outro módulo ausente foi relatado.
precisa saber é o seguinte
@ mklement0 Existe uma configuração cpan para baixar e criar módulos de pré-requisito automaticamente. Pode ser necessário ativar essa configuração. Como alternativa, o aplicativo cpanminus de configuração zero pode ser uma opção melhor.
Starfish
@ Starfish: Obrigado; para poupar tempo aos futuros leitores (pois parece que a resposta pode ser curta): como você ativa essa configuração?
precisa saber é o seguinte
1
By the way, Matt Trout, o re.plautor, escreveu um artigo listando várias alternativas, e ele mesmo sugere o uso replyem vez de re.pl: shadow.cat/blog/matt-s-trout/mstpan-17
Denilson Sá Maia
36

Eu escrevi um script que chamo de "psh":

#! /usr/bin/perl

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

Tudo o que você digita, ele avalia no 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
fonte
4
Isso funciona apenas para um liners ou pode lidar com códigos Perl de várias linhas, como ramificação condicional, loops e instruções aninhadas?
David
23

Se você quiser histórico, use rlwrap . Pode ser seu, ~/bin/ipspor exemplo:

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

E é assim que parece:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 
Ján Sáreník
fonte
4
Parabéns por resumir bem - o suporte à linha de leitura não é apenas necessário para o histórico, mas também para editar a linha de comando. Com exceção do suporte de várias linhas, isso funciona bem; aqui está uma versão alias como uma alternativa: alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'. Usuários OSX podem instalar rlwrapvia Homebrew com brew install rlwrap.
precisa saber é o seguinte
Aqui está uma versão que dá uma saída agradável quando os avalia expressão a uma lista ou uma referência:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
Michau
21

Eu acho que você está perguntando sobre uma interface REPL (ler, avaliar, imprimir, loop) para perl. Há algumas maneiras de fazer isto:

  • Matt Trout tem um artigo que descreve como escrever um
  • Adriano Ferreira descreveu algumas opções
  • e, finalmente, você pode acessar o IRC em irc.perl.org e experimentar um dos bots de avaliação em muitos dos canais populares. Eles avaliarão pedaços de perl que você passa para eles.
amoore
fonte
1
O artigo de Matt Trout está em exibição
lepe
1
Matt Trout agora tem uma lista muito mais até à data de REPLs ele recomenda: shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic
20

Eu uso a linha de comando como um console:

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

Então eu posso usar meu histórico do bash para recuperar comandos antigos. Isso não preserva o estado, no entanto.

Este formulário é mais útil quando você deseja testar "uma coisinha" (como ao responder perguntas de Perl). Muitas vezes, acho que esses comandos são escritos literalmente em um script de shell ou makefile.

Jon Ericson
fonte
1
Com algumas conchas, fishvocê nem precisa do \n.
trysis
15

Não há um console interativo para Perl integrado como o Python. No entanto, você pode usar o Perl Debugger para executar tarefas relacionadas à depuração. Você o ativa com a opção -d, mas pode querer verificar o 'man perldebug' para aprender sobre isso.

Depois de pesquisar um pouco, existe um projeto separado que implementa um console Perl que você pode encontrar em http://www.sukria.net/perlconsole.html .

Espero que isto ajude!

Frank Wiles
fonte
Estranho que esta resposta não tenha recebido votos positivos, mesmo que fosse anterior à resposta aceita e forneça um pouco mais de informação também. +1
Junuxx 18/10/12
14

Você sempre pode simplesmente entrar no depurador interno e executar comandos a partir daí.

   perl -d -e 1
Clinton Pierce
fonte
13

Existem dois REPLs Perl populares.

  1. Devel :: REPL é ótimo.
  2. Mas a resposta da IMO é melhor.
Eric Johnson
fonte
7
+1 por recomendar resposta. O próprio autor do Devel :: REPL recomendou o Reply sobre sua própria solução quando pergunto sobre um bom Perl REPL (console) no IRC. A resposta também vem com o preenchimento automático, muito útil para inspecionar os métodos e atributos disponíveis de um objeto. Eu poderia instalar Responder no Ubuntu com o seguinte comando: sudo apt-get install libreply-perl. Em seguida, ele pode ser executado simplesmente digitando replyum terminal.
Apteryx
Como você instala o amd run Reply? Nem a página do Metacpan, nem a do Github fornecem instruções.
Philippe
12

Eu criei perlium Perl REPL que roda em Linux, macOS e Windows .

Seu foco é a impressão automática de resultados, pesquisas práticas na documentação e inspeção fácil de correspondências de expressões regulares.
Você pode ver as capturas de tela aqui .

Funciona independente (não possui dependências além do próprio Perl), mas é altamente recomendável a instalação derlwrap , a fim de oferecer suporte à edição de linha de comando, histórico de comandos persistente e conclusão de guias - leia mais aqui .

Instalação

  • Se você tiver o Node.js instalado:

    npm install -g perli
  • De outra forma:

    • Plataformas do tipo Unix : Faça o download desse script como perliuma pasta no caminho do sistema e torne-o executável chmod +x.

    • Windows : Faça o download deste script como perli.pl(observe a .plextensão) para uma pasta no caminho do sistema.
      Se você não se importa de chamar Perli como perli.pl, está tudo pronto.
      Caso contrário, crie um arquivo perli.cmdem lotes nomeado na mesma pasta com o seguinte conteúdo @%~dpn.pl %*:; isso permite a invocação como justa perli.

mklement0
fonte
1
Eu gosto que ele pode iniciar a perldocpartir do perliREPL 'someCommand ?'. Parece que não foi atualizado por um tempo, você ainda está mantendo o perli?
Sdkks
1
@sdkks: Se você encontrar um problema, relate-o no GitHub e tentarei corrigi-lo. perlinão foi atualizado há algum tempo, porque, no meu uso pessoal, não encontro nenhum problema e poucas pessoas parecem usá-lo, mas, tanto quanto sei, ainda funciona como anunciado.
mklement0
7

Eu sempre fiz:

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

Com a 5.10, mudei para:

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

(rlwrap é opcional)

ysth
fonte
6

perl -d é seu amigo:

% perl -de 0
Brian Phillips
fonte
6

re.pl de Devel :: REPL


fonte
5

Loop de leitura e avaliação:

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

O Perl não possui um console, mas o depurador pode ser usado como um. No prompt de comando, digite perl -de 1. (O valor "1" não importa, é apenas uma declaração válida que não faz nada.)

Existem também algumas opções para um shell Perl .

Para mais informações, leia perlfaq3 .

Michael Carman
fonte
4

Você pode procurar no psh aqui: http://gnp.github.io/psh/

É um shell completo (você pode usá-lo em substituição ao bash, por exemplo), mas usa a sintaxe perl .. para criar métodos dinamicamente etc.

shelfoo
fonte
3

Sob Debian / Ubuntu:

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

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

A visão geral de Matt Trout lista cinco opções, a partir perl -de 0de então, e ele recomenda Reply, se a extensibilidade via plug-ins é importante, ou a tinyreplpartir de Eval::WithLexicals, para uma solução mínima de perl puro que inclua suporte à linha de leitura e persistência lexical.

Davor Cubranic
fonte
2

Atualização: criei um REPL para download - veja minha outra resposta .

Com o benefício da retrospectiva:

  • As soluções de terceiros mencionadas nas respostas existentes são difíceis de instalar e / ou não funcionam sem etapas adicionais não triviais e não óbvias - algumas soluções parecem estar pelo menos meio abandonadas.
  • Um REPL utilizável precisa da biblioteca readline para suporte ao teclado de edição de linha de comando e suporte ao histórico - garantindo que este seja um ponto problemático para muitas soluções de terceiros.
  • Se você instalar a CLI rlwrap, que fornece suporte de linha de leitura a qualquer comando, poderá combiná-la com um comando Perl simples para criar um REPL utilizável e, assim, se contentar com as soluções REPL de terceiros.
    • No OSX, você pode instalar rlwrapvia Homebrew with brew install rlwrap.
    • As distribuições Linux devem oferecer rlwrapatravés de seus respectivos gerenciadores de pacotes; por exemplo, no Ubuntu, use sudo apt-get install rlwrap.
    • Veja a resposta de Ján Sáreník para a referida combinação de rlwrape um comando Perl.

O que você NÃO recebe com a resposta de Ján:

  • conclusão automática
  • capacidade de inserir instruções com várias linhas

A única solução de terceiros que oferece essas opções (com instalação não trivial + etapas adicionais e não óbvias) é psh , mas:

  • não vê atividade há cerca de 2,5 anos

  • seu foco é diferente na medida em que pretende ser um pleno direito de substituição shell , e, portanto, funciona como um escudo tradicional, o que significa que não avalia automaticamente um comando como Perl declaração, e requer um comando de saída explícita, como printa imprime o resultado de uma expressão.


A resposta de Ján Sáreník pode ser melhorada de uma maneira:

  • Por padrão, ele imprime matrizes / listas / hashtables como escalares , ou seja, apenas imprime sua contagem de elementos , enquanto que seria útil enumerar seus elementos.

Se você instalar o Data::Printermódulo [sudo] cpan Data::Printercomo uma operação única, poderá carregá-lo no REPL para uso da p()função, para o qual pode passar listas / matrizes / hashtables para enumeração.

Aqui está um apelido nomeado iperlcom readline e Data::Printersuporte , que você pode colocar no arquivo de inicialização do seu shell semelhante ao POSIX (por exemplo, ~/.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 exemplo, você pode fazer o seguinte para imprimir todas as variáveis ​​de ambiente via hashtable %ENV:

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

Como na resposta de Ján, o resultado escalar de uma expressão é impresso automaticamente ; por exemplo:

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

Sépia e PDE também possuem REPLs (para GNU Emacs).


fonte