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

313

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

24个回答

343

您可以在类似下面这样的简单程序中使用Perl调试器:

perl -de1

这个命令将在表达式1 (-e1)上启动Perl调试器(-d), 因为调试器需要一些东西来进行调试(通常是一个包含Perl代码的文件)。 该命令也可以写成 perl -d -e 1

另外,还有Alexis Sukrieh的Perl控制台应用程序,但我没有使用过。


38
如果您想要最小可用功能,请考虑添加 rlwrap $ rlwrap perl -d -e 1。这将使您获得历史记录和一致的提示符。 - albfan
在这个命令界面下,control+L无法使用,我该如何刷新屏幕? - Zen
2
通过事后的观察:Ján Sáreník的回答似乎提供了最好的几乎开箱即用的解决方案(您可能需要安装“rlwrap”)。所有第三方REPL/控制台解决方案,包括“perlconsole”,都很麻烦,并且通常有更多限制。 - mklement0
4
很不幸,perl -de1 看起来不支持 my 变量,而且由于某种原因哈希表也不能使用…… - Geremia
2
perlconsole 不会受到这些问题的困扰。 - Geremia
rlwrap 改变了我的生活。 - mondaugen

68

Matt Trout不仅写了一篇关于REPL的文章,他还亲自编写了一个实现 - Devel::REPL

我用过它一段时间,它运行得相当好,并且正在积极开发中。

顺便说一下,我不知道为什么有人给那个提到从控制台使用"perl -e"的人评分降低。 真的,这并不是一个真正的REPL,但它非常有用,我一直在使用它。


我想大家可能认为我没有理解这个问题。我猜我需要稍微修改一下。;-) - Jon Ericson
截至2015年中期:仅运行[sudo] cpan Devel::REPL对我来说不起作用,无论是在OSX 10.10(Perl 5.18.2)还是Ubuntu 14.04(Perl 5.18.2)上都是如此:我遇到了缺少模块的运行时错误;安装了一个模块,然后在报告另一个缺失模块后放弃了。 - mklement0
@mklement0 有一个 cpan 设置可以自动下载和构建先决模块。您可能需要打开该设置。或者,零配置的 cpanminus 应用程序可能是更好的选择。 - Starfish
@Starfish:谢谢;为了节省未来读者的时间(因为答案可能很简短):你如何打开这个设置? - mklement0
1
顺便提一下,“re.pl”的作者Matt Trout写了一篇文章列出了几个替代品,他自己建议使用“reply”而不是“re.pl”:http://shadow.cat/blog/matt-s-trout/mstpan-17/ - Denilson Sá Maia
刚刚在Centos 6 / Perl 5.10上安装了这个,它拉入了88个新的/更新的模块!对于一个REPL来说,似乎有点多... - harmic

45

如果您需要历史记录,请使用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> 

8
表扬你很好地完成了它 - readline支持不仅需要用于历史记录,还需要用于编辑命令行。除了多行支持外,它的运行良好;这里有一个备选方案的别名版本:alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'。OSX用户可以通过Homebrew安装rlwrap,使用brew install rlwrap即可。 - mklement0
5
这里有一个版本,当表达式计算结果为列表或引用时,可以得到漂亮的输出:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@' - michau

40

我写了一个我称之为“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

5
这是否仅适用于一行代码,还是可以处理多行 Perl 代码,如条件分支、循环和嵌套语句? - David

23

我认为你在问有关 Perl 的 REPL(读取、求值、输出、循环)界面。有几种方法可以实现:

  • Matt Trout 写了一篇文章描述如何编写一个 REPL,文章链接是这个
  • Adriano Ferreira 介绍了一些选项
  • 最后,你可以登录 irc.perl.org 并尝试在许多受欢迎的频道中使用其中一个 eval 机器人来评估你传递给它们的 Perl 代码块。

1
Matt Trout的文章已经下线多年了,你可以在这里找到它:https://web.archive.org/web/20100212100032/http://chainsawblues.vox.com/library/post/a-perl-read-excute-print-loop-repl.html - lepe
1
Matt Trout现在推荐了一个更新的REPL清单:http://shadow.cat/blog/matt-s-trout/mstpan-17/。 - Davor Cubranic

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

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

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

然后我可以使用我的bash历史记录来获取以前的命令。然而,这不会保留状态。

当您想要测试“一点小东西”(例如回答Perl问题时)时,此表单最有用。通常,我发现这些命令会被逐字地抓取到一个shell脚本或makefile中。


1
有些 shell(比如 fish),甚至不需要使用 \n - trysis

20

就像Python一样,Perl中没有内置的交互式控制台。但是,您可以使用Perl调试器来进行调试相关的操作。您可以使用-d选项启动它,但是建议您查看'man perldebug'以了解有关它的信息。

经过一点谷歌搜索,发现有一个单独的项目实现了Perl控制台,您可以在Perl Console - 带有完成的Perl代码交互评估器中找到。

希望这可以帮助您!


很奇怪这个回答没有得到任何赞,尽管它比被接受的答案更早,并且提供了更多的信息。+1 - Junuxx

18

有两种流行的Perl REPL。

  1. Devel::REPL 很好。
  2. 但在我看来Reply更好。

对于reply,只需将其作为命令运行。该模块会安装reply脚本。如果您已经安装了该模块但没有这个命令,请检查您的PATH变量。

$ reply --help
reply [-lb] [-I dir] [-M mod] [--version] [--help] [--cfg file]

9
推荐回复(Reply)加一。当我在IRC上询问一个好的Perl REPL(控制台)时,Devel::REPL的作者本人推荐使用Reply而不是他自己的解决方案。Reply还带有自动完成功能,非常方便查看对象可用的方法和属性。我可以使用以下命令在Ubuntu上安装Reply:sudo apt-get install libreply-perl。然后,在终端中只需键入reply即可运行它。 - Apteryx
1
你如何安装和运行 Reply?Metacpan和Github页面都没有提供说明。 - Philippe
请检查已编辑的答案。回复 - Gilles Quénot

15

我创建了perli,它是一个在Linux、macOS和Windows上运行的Perl REPL

它的重点是自动结果打印、方便的文档查找和正则表达式匹配的易于检查。
你可以在这里看到屏幕截图here

它是独立运行的(除了Perl本身之外没有其他依赖项),但强烈建议安装rlwrap以支持命令行编辑、持久化命令历史记录和制表符补全-在此处阅读更多信息here

安装

  • 如果您已经安装了Node.js:

  • npm install -g perli
    
  • 否则:

    • 类Unix平台: 从此处下载perli脚本文件并将其放到系统路径中的某个目录中,然后使用chmod +x命令使其可执行。

    • Windows: 从此处下载perli.pl脚本文件(注意扩展名是.pl),并将其放到系统路径中的某个目录中。
      如果你不介意命名为perli.pl,那么你已经完成了设置。
      否则,在同一个文件夹中创建一个批处理文件,命名为perli.cmd,并将以下内容复制进去:@%~dpn.pl %*。这样就可以使用perli来调用该脚本了。


2
我喜欢可以在 perli REPL 中像 'someCommand ?' 一样启动 perldoc。不过看起来它已经有一段时间没有更新了,你还在维护 perli 吗? - user3905644
3
如果你发现了问题,请在GitHub上报告问题,我会尝试修复它。perli已经有一段时间没有更新了,因为在我的个人使用中,我还没有遇到任何问题,而且似乎很少有人在使用它,但据我所知,它仍然可以正常工作。 - mklement0
3
我报告了一个问题,@mklement0 在不到 24 小时内解决了它并发布了新版本。FWIW。 :) - David Moles

15

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

   perl -d -e 1

请参见 https://dev59.com/ZnVD5IYBdhLWcg3wI4CM#73703。 - U. Windl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接