如何为Perl启动交互式控制台,类似于Ruby的irb命令或Python的python命令?
您可以在简单的程序上使用perl调试器,如下所示:
另外,还有Alexis Sukrieh的Perl Console应用程序,但我没有使用过。
马特·特劳特(Matt Trout)不仅写了一篇关于REPL的文章,还写了一篇-Devel :: REPL
我已经使用了一段时间,并且效果很好,并且正在积极开发中。
顺便说一句,我不知道为什么有人从控制台使用" perl -e"来修饰提到的人。确实,这不是真正的REPL,但是它非常有用,我一直在使用它。
我写了一个脚本,称为" psh":
1 2 3 4 5 6 7 8
| #! /usr/bin/perl
while (<>) {
chomp;
my $result = eval;
print"$_ = $result
";
} |
无论您输入什么,它都会在Perl中求值:
1 2 3 4 5 6 7 8 9 10 11
| > 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 |
如果需要历史记录,请使用rlwrap。例如,这可能是您的~/bin/ips:
1 2 3
| #!/bin/sh
echo 'This is Interactive Perl shell'
rlwrap -A -pgreen -S"perl>" perl -wnE'say eval()//$@' |
这是这样的:
1 2 3 4 5
| $ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> |
我认为您是在询问PERL的REPL(读取,评估,打印,循环)接口。有几种方法可以做到这一点:
-
Matt Trout的文章描述了如何编写一个
-
阿德里亚诺·费雷拉(Adriano Ferreira)描述了一些选择
-
最后,您可以在irc.perl.org上跳至IRC,并尝试许多流行频道中的评估机器人之一。他们将评估您传递给他们的perl块。
我使用命令行作为控制台:
1 2
| $ perl -e 'print"JAPH
"' |
然后,我可以使用bash历史记录来恢复旧命令。但是,这不会保留状态。
当您要测试"一件小事"时(例如回答Perl问题时),此表格最有用。通常,我发现这些命令被逐字记录到shell脚本或makefile中。
没有像Python那样内置的Perl交互式控制台。但是,您可以使用Perl调试器进行调试相关的事情。您可以使用-d选项将其打开,但是您可能需要查看'man perldebug'来了解它。
进行一些谷歌搜索之后,有一个单独的项目实现了Perl控制台,您可以在http://www.sukria.net/perlconsole.html上找到它。
希望这可以帮助!
您总是可以直接进入内置调试器并从那里运行命令。
有两种流行的Perl REPL。
Devel :: REPL很棒。
但是,IMO的答复更好。
我创建了perli,这是一个可在Linux,macOS和Windows上运行的Perl REPL。
它的重点是自动结果打印,方便的文档查找以及简便的操作
检查正则表达式匹配项。
您可以在此处查看屏幕截图。
它可以独立运行(除了Perl本身没有其他依赖项),但是强烈建议安装rlwrap以便支持命令行编辑,持久性命令历史记录和制表符补全-在此处了解更多信息。
安装
-
如果您碰巧安装了Node.js:
-
除此以外:
-
类似于Unix的平台:将该脚本作为perli下载到系统路径中的文件夹中,并使其可以通过chmod +x执行。
-
Windows:将此脚本以perli.pl(注意扩展名.pl)下载到系统路径中的文件夹。
如果您不介意将Perli调用为perli.pl,那么一切都准备就绪。
否则,在具有以下内容的同一文件夹中创建一个名为perli.cmd的批处理文件:@%~dpn.pl %*;这使得调用仅作为perli。
来自Devel:.REPL的re.pl
perl -d是您的朋友:
我总是这样做:
1
| perl -wlne'eval;print$@if$@' |
使用5.10,我已切换到:
1
| perl -wnE'say eval()//$@' |
读评估打印循环:
1 2
| $ perl -e'while(<>){print eval,"
"}' |
Perl没有控制台,但是调试器可以用作控制台。在命令提示符下,键入perl -de 1。 (值" 1"无关紧要,它只是不执行任何操作的有效语句。)
Perl shell也有两个选项。
有关更多信息,请阅读perlfaq3。
您可以在此处查看psh:http://gnp.github.io/psh/
它是完整的shell(例如,您可以用它代替bash),但是使用perl语法..因此您可以动态创建方法等。
在Debian / Ubuntu下:
1 2 3 4 5
| $ sudo apt-get install libdevel-repl-perl
$ re.pl
$ sudo apt-get install libapp-repl-perl
$ iperl |
更新:我已经创建了一个可下载的REPL-请参阅我的其他答案。
事后看来:
-
现有答案中提到的第三方解决方案要么安装麻烦,和/或如果没有非平凡,非显而易见的附加步骤就无法工作-有些解决方案似乎至少被放弃了。
-
可用的REPL需要readline库来提供命令行编辑键盘支持和历史记录支持-确保这是许多第三方解决方案的麻烦点。
-
如果安装CLI rlwrap,该命令行提供对任何命令的读取行支持,则可以将其与简单的Perl命令结合使用,以创建可用的REPL,从而无需第三方REPL解决方案。
-
在OSX上,可以通过Homebrew和brew install rlwrap安装rlwrap。
-
Linux发行版应通过各自的软件包管理器提供rlwrap;例如,在Ubuntu上,使用sudo apt-get install rlwrap。
-
有关rlwrap和Perl命令的所述组合,请参见JánSáreník的答案。
Ján的答案不会给您带来什么:
提供这些功能的唯一第三方解决方案(非简单安装+附加,非显而易见的步骤)是psh,但是:
JánSáreník的答案可以通过以下一种方法加以改进:
-
默认情况下,它以标量的形式打印数组/列表/哈希表,即仅打印其元素计数,而枚举其元素将很方便。
如果将Data::Printer模块与[sudo] cpan Data::Printer一起安装为一次性操作,则可以将其加载到REPL中以使用p()函数,您可以将列表/数组/哈希表传递给该函数进行枚举。
这是一个名为iperl的别名,具有readline和Data::Printer支持,您可以将其放入类似POSIX的shell的初始化文件(例如~/.bashrc)中:
1
| alias iperl='rlwrap -A -S"iperl>" perl -MData::Printer -wnE '\''BEGIN { say"# Use `p @` or `p %<hashTable>` to print arrays/lists/hashtables; e.g.: `p %ENV`"; } say eval()//$@'\' |
例如,然后您可以执行以下操作以通过哈希表%ENV打印所有环境变量:
1 2
| $ iperl # start the REPL
iperl> p %ENV # print key-value pairs in hashtable %ENV |
与Ján的答案一样,表达式的标量结果会自动打印出来;例如。:
1
| iperl> 22 / 7 # automatically print scalar result of expression: 3.14285714285714 |
Matt Trout的概述列出了从perl -de 0开始的五个选择,如果推荐通过插件的可扩展性很重要,则建议使用Reply,或者从Eval::WithLexicals推荐tinyrepl,以获得最小的纯perl解决方案,其中包括readline支持和词汇坚持不懈。
棕褐色和PDE也有自己的REPL(对于GNU Emacs)。
还要在CPAN上查找ptkdb:
http://search.cpan.org/search?query=ptkdb&mode=all
另请参见时尚的REPL(适用于GNU Emacs)http://blog.jrock.us/articles/Stylish%20REPL.pod