我怎样才能启动一个Perl的交互式控制台?
如何启动Perl的交互式控制台,类似于Ruby的Python命令或python
的Python?
您可以在一个简单的程序上使用perldebugging器,如下所示:
perl -de1
另外还有Alexis Sukrieh的Perl控制台应用程序,但我没有使用它。
Matt Trout不仅写了一篇关于REPL的文章,还写了一篇–Devel :: REPL
我已经使用了一些,它运行得很好,正在积极的发展。
顺便说一句,我不知道为什么有人在控制台上使用“perl -e”提到这个人。 这不是一个真正的REPL,但是它非常有用,而且我一直都在使用它。
我写了一个我称之为“psh”的脚本:
#! /usr/bin/perl while (<>) { chomp; my $result = eval; print "$_ = $result\n"; }
无论你input什么,它都以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
我想你正在问一个REPL(读,评估,打印,循环)接口到Perl。 有几种方法可以做到这一点:
- 马特·鳟鱼有一篇文章 ,描述如何写一个
- 阿德里亚诺·费雷拉描述了一些select
- 最后,您可以在irc.perl.org上跳到IRC上,并在许多热门频道中试用其中一款eval机器人。 他们会评估你传给他们的perl块。
我使用命令行作为控制台:
$ perl -e 'print "JAPH\n"'
然后,我可以使用我的bash历史找回旧的命令。 但是这并不能保持状态。
当你想testing“一件小事”(比如在回答Perl问题的时候),这种forms是最有用的。 通常情况下,我发现这些命令被逐字地写入到shell脚本或makefile中。
Perl没有像Python那样的交互式控制台。 但是,您可以使用Perldebugging器进行debugging相关的事情。 你用-d选项打开它,但你可能想看看“man perldebug”来了解它。
经过一番search,有一个单独的项目实现了一个Perl控制台,你可以在http://www.sukria.net/perlconsole.htmlfind。;
希望这可以帮助!
你总是可以放入内置的debugging器并从那里运行命令。
perl -d -e 1
如果你想要历史,请使用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>
有两种stream行的Perl REPLs。
1. Devel :: REPL很棒。
但是IMO 回复更好。
我创build了perli
,一个运行在Linux,OS X和Windows上的Perl REPL 。
其重点是自动结果打印,方便的文档查找,以及对正则expression式匹配的简单检查。
你可以在这里看到截图。
它独立工作(除Perl本身之外没有任何依赖关系),但强烈build议安装rlwrap
以支持命令行编辑,持久性命令历史logging和制表符完成 – 请阅读此处 。
安装
-
如果你碰巧安装了Node.js / io.js:
npm install -g perli
-
除此以外:
-
类Unix平台: 将此脚本作为
perli
下载到系统path中的文件夹,并使用chmod +x
使其可执行。 -
Windows: 将此脚本作为
perli.pl
(注意.pl
扩展名)下载到系统path中的文件夹中。
如果你不介意调用Perli作为perli.pl
,那么你就全部设置好了。
否则,请在以下内容的同一文件夹中创build一个名为perli.cmd
的batch file:@%~dpn.pl %*
; 这使得调用只是perli
。
-
来自Devel :: REPL的re.pl
perl -d
是你的朋友:
% perl -de 0
我一直这样做:
perl -wlne'eval;print$@if$@'
随着5.10,我已经转向:
perl -wnE'say eval()//$@'
Perl没有控制台,但是debugging器可以作为一个使用。 在命令提示符处,键入perl -de 1
。 (值“1”并不重要,只是一个无效的有效陈述。)
Perl shell也有几个选项。
有关更多信息,请阅读perlfaq3 。
Read-eval-print循环:
$ perl -e'while(<>){print eval,"\n"}'
你可以在这里查看psh: http ://gnp.github.io/psh/
这是一个完整的shell(你可以使用它来代替bash),但是使用perl语法..所以你可以在飞行中创build方法等。
更新:我已经创build了可下载的REPL – 请参阅我的其他答案 。
事后看来,
- 现有答案中提到的第三方解决scheme要么安装麻烦,要么在没有不明显的,不明显的附加步骤的情况下工作 – 某些解决scheme似乎至less被放弃了一半。
- 可用的REPL需要readline库来进行命令行编辑键盘支持和历史logging支持 – 确保这是许多第三方解决scheme的麻烦点。
- 如果您安装了CLI
rlwrap
,它为任何命令提供了readline支持,您可以将它与一个简单的Perl命令组合起来,以创build一个可用的REPL ,从而避免使用第三方REPL解决scheme。- 在OSX上,你可以使用
brew install rlwrap
通过Homebrew来brew install rlwrap
。 - Linux发行版应该通过各自的软件包pipe理器提供
rlwrap
; 例如在Ubuntu上,使用sudo apt-get install rlwrap
。 - 请参阅JánSáreník对rlwrap和Perl命令组合的回答 。
- 在OSX上,你可以使用
Ján的回答你没有得到 :
- 自动完成
- 能够input多行报表
唯一提供这些(不平凡的安装+额外的,不明显的步骤)的第三方解决scheme是psh ,但是:
-
在2.5年左右还没有看到活动
-
它的重点不同在于它的目标是成为一个完整的shell替代品 ,因此像传统的shell一样工作,这意味着它不会自动将命令评估为Perl语句,并且需要显式的输出命令,如
print
打印expression式的结果。
JánSáreník的答案可以通过一种方式得到改善:
- 默认情况下,它将数组/列表/哈希表打印为标量 ,即仅打印其元素数量 ,而列举其元素将会很方便。
如果使用[sudo] cpan Data::Printer
作为一次性操作安装Data::Printer
模块,则可以将其加载到REPL中以使用p()
函数,您可以将该函数传递给列表/数组/哈希表枚举。
下面是一个名为iperl
的别名, iperl
带有readline和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; eg: `p %ENV`"; } say eval()//$@'\'
例如,你可以通过哈希表%ENV
来打印所有的环境variables:
$ iperl # start the REPL iperl> p %ENV # print key-value pairs in hashtable %ENV
和Ján的回答一样,expression式的标量结果是自动打印的; 例如:
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
开始,他build议Reply
,如果通过插件的扩展性很重要,或者Eval::WithLexicals
,对于包括readline支持和词汇持久性的最小纯perl解决scheme。
在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