如何启动 Perl 的交互式控制台?
-
09-06-2019 - |
题
如何启动 Perl 的交互式控制台,类似于 irb
Ruby 命令或 python
对于Python?
解决方案
其他提示
Matt Trout 不仅写了一篇关于 REPL 的文章,他实际上还写了一篇 - 开发::REPL
我已经使用过它一点,效果相当好,并且正在积极开发中。
顺便说一句,我不知道为什么有人修改了提到从控制台使用“perl -e”的人。这确实不是一个真正的 REPL,但它非常有用,而且我一直在使用它。
我写了一个名为“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
如果您想要历史记录,请使用 回卷. 。这可能是你的 ~/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>
我使用命令行作为控制台:
$ perl -e 'print "JAPH\n"'
然后我就可以用我的 巴什 历史记录以取回旧命令。然而,这并不能保留状态。
当您想要测试“一件小事”时(例如回答 Perl 问题时),此形式最有用。我经常发现这些命令被逐字地写入 shell 脚本或 makefile 中。
Perl 没有像 Python 那样内置交互式控制台。但是,您可以使用 Perl 调试器来执行调试相关的操作。您可以使用 -d 选项打开它,但您可能想查看“man perldebug”来了解它。
经过一番谷歌搜索后,有一个单独的项目实现了 Perl 控制台,您可以在 http://www.sukria.net/perlconsole.html.
希望这可以帮助!
您始终可以直接进入内置调试器并从那里运行命令。
perl -d -e 1
perl -d
是你的朋友:
% perl -de 0
来自 Devel::REPL 的 re.pl
我总是这样做:
perl -wlne'eval;print$@if$@'
在 5.10 中,我切换到:
perl -wnE'say eval()//$@'
读取-求值-打印循环:
$ perl -e'while(<>){print eval,"\n"}'
Perl 没有控制台,但可以将调试器用作控制台。在命令提示符处,键入 perl -de 1
. 。(值“1”并不重要,它只是一个不执行任何操作的有效语句。)
还有几个选项 Perl shell.
欲了解更多信息,请阅读 perlfaq3.
你可以在这里查看 psh: http://gnp.github.io/psh/
它是一个完整的 shell(例如,您可以使用它来替换 bash),但使用 perl 语法。所以你可以动态创建方法等。
在 Debian/Ubuntu 下:
$ sudo apt-get install libdevel-repl-perl
$ re.pl
$ sudo apt-get install libapp-repl-perl
$ iperl
更新:我已经创建了一个可下载的 REPL - 请参阅 我的另一个答案.
事后看来:
- 这 第三方解决方案 现有答案中提到的是 安装起来很麻烦和/或如果没有不平凡、不明显的额外步骤就无法工作 - 一些解决方案似乎至少被放弃了一半。
- 可用的 REPL 需要 readline 库来提供命令行编辑键盘支持和历史记录支持 - 确保这是许多第三方解决方案的麻烦点。
- 如果您安装 CLI
rlwrap
, ,它为任何命令提供 readline 支持,您可以将其与简单的 Perl 命令结合起来创建可用的 REPL, ,因此无需第三方 REPL 解决方案。
你没有得到什么 Ján 的回答是:
- 自动完成
- 输入多行语句的能力
提供这些功能的唯一第三方解决方案(具有重要的安装+额外的、不明显的步骤)是 普什, , 但:
大约 2.5 年没有出现任何活动
它的重点有所不同,因为它的目标是成为一个成熟的 更换外壳, ,因此工作方式类似于传统 shell,这意味着它不会自动将命令评估为 珀尔 语句,并且需要显式输出命令,例如
print
打印表达式的结果。
扬·萨雷尼克的回答 可以通过一种方式改进:
- 默认情况下,它 将数组/列表/哈希表打印为 标量, ,即只打印他们的 元素计数, ,而枚举它们的元素会很方便。
如果您安装 Data::Printer
模块与 [sudo] cpan Data::Printer
作为一次性操作,您可以将其加载到 REPL 中以供使用 p()
函数,您可以向其传递列表/数组/哈希表进行枚举。
这是一个 别名名为 iperl
与阅读线和 Data::Printer
支持, ,您可以将其放入类 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()//$@'\'
例如,您可以执行以下操作以通过哈希表打印所有环境变量 %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
马特·特劳特的 概述 列出了五个选择,从 perl -de 0
从那时起,他建议 Reply
, ,如果通过插件的可扩展性很重要,或者 tinyrepl
从 Eval::WithLexicals
, ,一个最小的、纯 Perl 的解决方案,包括 readline 支持和词法持久性。
还要在 CPAN 上查找 ptkdb:http://search.cpan.org/search?query=ptkdb&mode=all
Sepia 和 PDE 也有自己的 REPL(用于 GNU Emacs)。
另请参阅时尚 REPL(适用于 GNU Emacs) http://blog.jrock.us/articles/Stylish%20REPL.pod