如何为Perl启动交互式控制台?

时间:2008-09-16 15:35:59

标签: perl console interactive read-eval-print-loop

如何为Perl启动交互式控制台,类似于Ruby的irb命令或Python的python

24 个答案:

答案 0 :(得分:275)

你可以在一个简单的程序上使用perl调试器,如下所示:

perl -de1

或者有Alexis Sukrieh's Perl Console申请,但我没有使用它。

答案 1 :(得分:59)

Matt Trout不仅写了一篇关于REPL的文章,他实际上写了一篇 - Devel::REPL

我已经使用了一点而且效果相当好,并且正在积极开发中。

顺便说一句,我不知道为什么有人对控制台上使用“perl -e”提到的人进行了修改。这不是真正的REPL,是的,但它非常有用,而且我一直都在使用它。

答案 2 :(得分:34)

我写了一个我称之为“psh”的脚本:

#! /usr/bin/perl

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

无论你输入什么内容,它都会在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

答案 3 :(得分:21)

如果您需要历史记录,请使用rlwrap。例如,这可能是您的~/bin/ips

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

这就是它的样子:

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

答案 4 :(得分:20)

我认为你问的是perl的REPL(读取,评估,打印,循环)接口。有几种方法可以做到这一点:

  • Matt Trout有an article描述如何写一个
  • Adriano Ferreira has described some options
  • 最后,您可以在irc.perl.org上跳过IRC,并在许多热门频道中试用其中一个评估机器人。他们将评估你传递给他们的perl块。

答案 5 :(得分:19)

我使用命令行作为控制台:

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

然后我可以使用 bash 历史来恢复旧命令。但是,这并不保留状态。

当您想要测试“一件小事”时(例如回答Perl问题时),此表单最有用。通常,我发现这些命令被逐字删除到shell脚本或makefile中。

答案 6 :(得分:15)

没有像Python那样内置Perl的交互式控制台。但是,您可以使用Perl调试器来调试相关的事情。你用-d选项打开它,但你可能想看看'man perldebug'来了解它。

经过一些谷歌搜索后,有一个单独的项目实现了一个Perl控制台,你可以在 http://www.sukria.net/perlconsole.html找到它。

希望这有帮助!

答案 7 :(得分:14)

您可以随时进入内置调试器并从那里运行命令。

   perl -d -e 1

答案 8 :(得分:11)

有两种流行的Perl REPL 1. Devel::REPL很棒 但IMO Reply更好。

答案 9 :(得分:10)

我已创建perli Perl REPL ,可在 Linux,macOS和Windows 上运行。

它的重点是自动结果打印,方便的文档查找和简单 检查正则表达式匹配 您可以看到屏幕截图here

独立(没有Perl本身以外的依赖项),但强烈建议安装rlwrap 以支持命令行编辑,持久性命令历史记录和制表符完成 - 阅读更多here

<强>安装

  • 如果您碰巧安装了Node.js:

    npm install -g perli
    
  • 否则:

    • Unix 类似平台:将this script作为perli下载到系统路径中的文件夹,并使其{{1}成为可执行文件}。

    • Windows :将this script作为chmod +x(请注意perli.pl扩展名)下载到系统路径中的文件夹中。
      如果您不介意以.pl方式调用Perli,那么您已全部设置完毕。
      否则,在具有以下内容的同一文件夹中创建名为perli.pl的批处理文件:perli.cmd;这使得调用仅为@%~dpn.pl %*

答案 10 :(得分:6)

perl -d是你的朋友:

% perl -de 0

答案 11 :(得分:6)

来自Devel :: REPL的re.pl

答案 12 :(得分:5)

我一直这样做:

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

使用5.10,我已切换到:

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

答案 13 :(得分:5)

Read-eval-print loop:

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

答案 14 :(得分:4)

Perl没有控制台,但调试器可以用作一个。在命令提示符处,键入perl -de 1。 (值“1”无关紧要,它只是一个无效的有效语句。)

Perl shell还有几个选项。

有关详细信息,请参阅perlfaq3

答案 15 :(得分:3)

你可以在这里查看psh:http://gnp.github.io/psh/

它是一个完整的shell(你可以用它代替bash),但是使用perl语法..所以你可以动态创建方法等。

答案 16 :(得分:3)

在Debian / Ubuntu下:

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

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

答案 17 :(得分:2)

更新:我之后创建了一个可下载的REPL - 请参阅my other answer

事后看来:

  • 现有答案中提到的第三方解决方案要么安装繁琐,要么在没有非平凡,非显而易见的额外步骤的情况下无法正常工作 - 有些解决方案似乎至少被遗弃了一半。
  • 可用的REPL需要readline库来进行命令行编辑键盘支持和历史记录支持 - 确保这是许多第三方解决方案的麻烦点。
  • 如果您安装CLI rlwrap,它为任何命令提供readline支持,您可以将它与一个简单的Perl命令组合以创建一个可用的REPL ,从而无需第三个 - 派对REPL解决方案。
    • 在OSX上,您可以使用rlwrap通过Homebrew安装brew install rlwrap
    • Linux发行版应该通过各自的包管理器提供rlwrap;例如,在Ubuntu上,使用sudo apt-get install rlwrap
    • 有关rlwrap和Perl命令的所述组合,请参阅Ján Sáreník's answer
使用Ján的回答

你得不到什么

  • 自动完成
  • 输入多行语句的能力

唯一提供这些解决方案的第三方解决方案(包括非平凡的安装+其他非显而易见的步骤)是 psh ,但是:

  • 它在大约2。5年内没有看到活动

  • 它的重点不同之处在于它旨在成为一个成熟的 shell替换,因此就像传统的shell一样工作,这意味着它不会自动将命令评估为 Perl 语句,需要显式输出命令(如print)才能打印表达式的结果。

Ján Sáreník's answer可以通过以下方式进行改进:

  • 默认情况下,将数组/列表/哈希表打印为标量 ,即只打印元素计数,而它会很方便而是枚举他们的元素。

如果您使用Data::Printer作为一次性操作安装 [sudo] cpan Data::Printer 模块,则可以将其加载到REPL中以使用 {{1函数,您可以将list / arrays / hashtables传递给枚举。

这是一个名为p()别名,带有readline和iperl支持,您可以将其放入类似POSIX的shell的初始化文件中(例如Data::Printer) :

~/.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()//$@'\' 打印所有环境变量:

%ENV

与Ján的回答一样,表达式的标量结果是自动打印; e.g:

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

答案 18 :(得分:1)

您可以在此处在线(就像生活中的许多事情一样):

https://www.tutorialspoint.com/execute_perl_online.php

答案 19 :(得分:1)

Matt Trout的overview列出了五个选项,从perl -de 0开始,他推荐Reply,如果插件的可扩展性很重要,或tinyrepl来自Eval::WithLexicals ,对于最小的纯perl解决方案,包括readline支持和词汇持久性。

答案 20 :(得分:0)

您可以在org-babel中使用emacs;打开一个org-mode文件,即tmp.org,然后你可以:

#+begin_src perl :results output
@a = (1,5,9);
print ((join ", ", @a) . "\n");
$b = scalar @a;
print "$#a, $b\n";
print "$#a, " . @a . "\n";
print join ", ", 1..$#a; print "\n";
print join ", ", @a[0..$#a]
#+end_src

CTRL-c CTRL-c 评估块:

#+RESULTS:
#+begin_example
1, 5, 9
2, 3
2, 3
1, 2
1, 5, 9
#+end_example

我不确定这需要什么 emacs 配置才能工作,但我认为您只需安装 https://github.com/hlissner/doom-emacs 并启用其 perlorg-mode 模块。

答案 21 :(得分:0)

另请参阅Stylish REPL(适用于GNU Emacs)http://blog.jrock.us/articles/Stylish%20REPL.pod

答案 22 :(得分:0)

Sepia和PDE也有自己的REPL(对于GNU Emacs)。

答案 23 :(得分:0)