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


Answers:


297

您可以在普通程序上使用perl调试器,如下所示:

perl -de1

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


27
如果您想要一些最小限度的使用,请考虑添加rlwrap, $ rlwrap perl -d -e 1您将获得历史记录和一致的提示
albfan 2014年

control+ L在此命令界面下不起作用,如何刷新屏幕?

1
事后考虑:JánSáreník的答案似乎提供了最佳的即用型解决方案(您可能需要安装rlwrap)。所有第三方REPL /控制台解决方案(包括perlconsole)都安装麻烦,而且通常存在更多限制。
mklement0

3
不幸的是,由于某种原因,perl -de1它似乎不支持my变量,并且哈希也不起作用……
Geremia

1
perlconsole不会遭受这些问题的困扰。
Geremia'9

60

马特·特劳特(Matt Trout)不仅写了一篇关于REPL的文章,还写了一篇-Devel :: REPL

我已经使用了一段时间,并且效果很好,并且正在积极开发中。

顺便说一句,我不知道为什么有人从控制台使用“ perl -e”来修饰提到的人。这确实不是REPL,但确实非常有用,我一直都在使用它。


我认为这是我不明白的问题。我想我会对其进行编辑。;-)
乔恩·埃里克森

截至2015年中:[sudo] cpan Devel::REPL在OSX 10.10(Perl 5.18.2)或Ubuntu 14.04(Perl 5.18.2)上,简单运行都不适合我:我遇到运行时错误,抱怨缺少模块;安装一个,然后在报告另一个缺少的模块后放弃。
mklement0

@ mklement0有一个cpan设置,可以自动下载和构建必备模块。您可能需要打开该设置。或者,零配置cpanminus应用程序可能是更好的选择。
海星

@海星:谢谢;以节省未来的读者时间(因为答案似乎很短):如何打开此设置?
mklement0

1
顺便说一下,re.pl作者马特·特劳特(Matt Trout)写了一篇文章,列出了几种替代品,他本人建议使用reply代替re.plshadow.cat/blog/matt-s-trout/mstpan-17
DenilsonSáMaia

36

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

4
这仅适用于一个衬板,还是可以处理多行Perl代码,例如条件分支,循环,嵌套语句?
大卫

23

如果需要历史记录,请使用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
很好地包装它的荣誉-历史不仅需要readline支持,而且编辑命令行也需要。除多线支持外,此方法效果很好。这里是一个别名版本作为替代:alias iperl='rlwrap -A -S "perl> " perl -wnE '\''say eval()//$@'\'。OSX用户可以rlwrap通过Homebrew使用进行安装brew install rlwrap
mklement0

这是一个在表达式计算为列表或引用时可提供良好输出的版本:rlwrap -A -pgreen -S'perl> ' perl -MData::Dumper -wnE'say Dumper[eval()]//$@'
michau

21

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

  • Matt Trout 的文章描述了如何编写一个
  • 阿德里亚诺·费雷拉(Adriano Ferreira )描述了一些选择
  • 最后,您可以在irc.perl.org上跳至IRC,并尝试许多流行频道中的评估机器人之一。他们将评估您传递给他们的perl块。

1
马特·特劳特(Matt Trout)的文章早在几年前就下跌了,您可以在这里找到:web.archive.org/web/20100212100032/http
//chainsawblues.vox.com/…– lepe

1
马特·特劳特(Matt Trout)现在拥有他所推荐的REPL的最新列表:shadow.cat/blog/matt-s-trout/mstpan-17
Davor Cubranic

20

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

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

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

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


1
对于某些外壳,fish您甚至不需要\n
trysis

15

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

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

希望这可以帮助!


奇怪的是,这个答案还没有收到任何赞扬,即使它早于接受的答案,并且也提供了更多信息。+1
Junuxx 2012年


13

有两种流行的Perl REPL。

  1. Devel :: REPL很棒。
  2. 但是,IMO的答复更好。

7
+1以推荐回复。当我询问IRC上好的Perl REPL(控制台)时,Devel :: REPL的作者本人建议对自己的解决方案进行回复。回复还带有自动完成功能,它对于检查对象的可用方法和属性非常方便。我可以用下面的命令安装在Ubuntu回复:sudo apt-get install libreply-perl。然后,只需reply在终端中键入即可运行它。
Apteryx

您如何安装amd run举报?Metacpan或Github页面均未提供说明。
菲利普(Philippe)

12

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

它的重点是自动结果打印,方便的文档查找以及易于检查的正则表达式匹配项。
您可以在此处查看屏幕截图。

它可以独立运行(除了Perl本身没有其他依赖项),但是强烈建议安装,rlwrap以支持命令行编辑,持久命令历史记录和制表符完成- 在此处了解更多信息

安装

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

    npm install -g perli
  • 除此以外:

    • 类似于Unix的平台:将该脚本下载perli到系统路径中的文件夹中,并使用使其可执行chmod +x

    • Windows将此脚本下载为perli.pl(请注意.pl扩展名)到系统路径中的文件夹。
      如果您不介意以Perli身份调用Perli perli.pl,那么一切都准备就绪。
      否则,创建一个名为批处理文件perli.cmd中包含以下内容的文件夹:@%~dpn.pl %*; 这使得调用就像just一样perli


1
我喜欢它可以perldocperliREPL 启动'someCommand ?'。似乎它已经有一段时间没有更新了,您仍然保持perli吗?
sdkks

1
@sdkks:如果发现问题,请在GitHub上报告它,我将尝试修复它。perli一段时间没有更新,因为就我个人使用而言,我没有遇到任何问题,并且似乎没有其他人在使用它,但是据我所知,它仍然可以像宣传的那样工作。
mklement0

7

我总是这样做:

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

使用5.10,我已切换至:

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

(rlwrap是可选的)



6

来自Devel:.REPL的re.pl


5

读评估打印循环:

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

4

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

Perl shell也有两个选择。

有关更多信息,请阅读perlfaq3


4

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

这是一个完整的外壳程序(例如,您可以用它代替bash),但是使用perl语法..因此您可以动态创建方法等。


3

在Debian / Ubuntu下:

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

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


2

更新:我已经创建了一个可下载的REPL-请参阅我的其他答案

事后看来:

  • 第三方解决方案现有的答案中提到要么安装繁琐和/或不工作,没有不平凡的,非显而易见的额外的步骤 -一些解决方案似乎是至少半抛弃。
  • 可用的REPL需要readline库来提供命令行编辑键盘支持和历史记录支持 -确保这是许多第三方解决方案的麻烦点。
  • 如果安装CLI rlwrap(该命令行提供了对任何命令的读取行支持),则可以将其与简单的Perl命令结合使用以创建可用的REPL。,从而无需第三方REPL解决方案即可解决问题。
    • 在OSX上,您可以rlwrap通过Homebrew进行安装brew install rlwrap
    • Linux发行版应rlwrap通过各自的软件包管理器提供;例如,在Ubuntu上,使用sudo apt-get install rlwrap
    • 请参阅JánSáreník的答案rlwrap,以了解Perl命令和Perl命令的组合。

Ján的答案不会给您带来什么

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

提供这些功能的唯一第三方解决方案(具有非平凡的安装+附加的非显而易见的步骤)是psh,但是:

  • 它已经有2.5年没有活动了

  • 它的关注点有所不同,因为它的目标是成为完整的shell替代者,因此像传统的shell一样工作,这意味着它不会自动将命令评估为Perl语句,而是需要显式的输出命令,例如printto打印表达式的结果。


JánSáreník的答案可以通过以下一种方法加以改进:

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

如果一次性安装Data::Printer模块[sudo] cpan Data::Printer,则可以将其加载到REPL中以使用该p()功能,可以将列表/数组/哈希表传递给该函数进行枚举。

这是一个iperlreadline和Data::Printersupport 命名别名,您可以将其放入类似POSIX的shell的初始化文件(例如~/.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()//$@'\'

例如,您可以执行以下操作以通过hashtable打印所有环境变量%ENV

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

与Ján的答案一样,表达式的标量结果会自动打印出来。例如:

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

0

还要在CPAN上查找ptkdb:http ://search.cpan.org/search?query=ptkdb&mode=all


0

棕褐色和PDE也有自己的REPL(对于GNU Emacs)。



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.