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