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

ibz*_*ibz 255 console perl interactive read-eval-print-loop

如何为Perl启动交互式控制台,类似于irbRuby或pythonPython 的命令?

Dan*_*ian 288

您可以在一个简单的程序上使用perl调试器,如下所示:

perl -de1
Run Code Online (Sandbox Code Playgroud)

另外还有Alexis Sukrieh的Perl控制台应用程序,但我还没有使用它.

  • 如果你想要最小化的东西可以考虑添加[rlwrap](http://linux.die.net/man/1/rlwrap)` $ rlwrap perl -d -e 1`你会得到历史和一致的提示 (23认同)
  • 不幸的是,`perl -de1`似乎不支持`my`变量,而哈希也不起作用,出于某种原因...... (3认同)
  • 事后看来:[Ján Sáreník 的回答](http://stackoverflow.com/a/22840242/45375) 似乎提供了最好的几乎开箱即用的解决方案(您可能必须安装`rlwrap` )。所有第三方 REPL/控制台解决方案,包括“perlconsole”,安装起来都很麻烦,而且往往有更多限制。 (2认同)
  • `perlconsole` 不会遇到这些问题。 (2认同)

Dav*_*sky 59

Matt Trout不仅写了一篇关于REPL的文章,他还写了一篇--Devel :: REPL

我已经使用了一下它运行得相当好,而且它正在积极开发中.

顺便说一句,我不知道为什么有人对控制台上使用"perl -e"提到的人进行了修改.这不是真正的REPL,是真的,但它非常有用,而且我一直都在使用它.


ral*_*ldi 35

我写了一个我称之为"psh"的脚本:

#! /usr/bin/perl

while (<>) {
  chomp;
  my $result = eval;
  print "$_ = $result\n";
}
Run Code Online (Sandbox Code Playgroud)

无论你输入什么内容,它都会在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
Run Code Online (Sandbox Code Playgroud)

  • 这是仅适用于一个内衬还是可以处理多行Perl代码,如条件分支,循环,嵌套语句? (4认同)

Ján*_*ník 23

如果您需要历史记录,请使用rlwrap.这可能是你~/bin/ips的例子:

#!/bin/sh
echo 'This is Interactive Perl shell'
rlwrap -A -pgreen -S"perl> " perl -wnE'say eval()//$@'
Run Code Online (Sandbox Code Playgroud)

这就是它的样子:

$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl> 
Run Code Online (Sandbox Code Playgroud)

  • 感谢它很好地包装它 - 不仅需要readline支持历史记录,还需要编辑命令行.除了多线支持外,这种方法效果很好; 这里是一个别名版本作为替代:`alias iperl ='rlwrap -A -S"perl>"perl -wnE'\''说eval()// $ @'\'`.OSX用户可以通过[Homebrew](http://brew.sh)使用`brew install rlwrap`安装`rlwrap`. (4认同)
  • 这是一个当表达式计算为列表或引用时提供良好输出的版本: `rlwrap -A -pgreen -S'perl&gt; ' perl -MData::Dumper -wnE'say Dumper[eval()]// $@'` (2认同)

小智 20

我想你要问perl的REPL(读,评估,打印,循环)接口.有几种方法可以做到这一点:

  • Matt Trout有一篇文章描述了如何编写一个
  • 阿德里亚诺·费雷拉描述了一些选择
  • 最后,你可以在irc.perl.org上跳过IRC并在许多热门频道中试用一个评估机器人.他们将评估你传递给他们的perl块.


Jon*_*son 19

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

$ perl -e 'print "JAPH\n"'
Run Code Online (Sandbox Code Playgroud)

然后我可以使用我的bash历史来恢复旧命令.但是,这并不保留状态.

当您想要测试"一件小事"时(例如回答Perl问题时),此表单最有用.通常,我发现这些命令被逐字删除到shell脚本或makefile中.


Fra*_*les 15

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

经过一些谷歌搜索,有一个单独的项目,实现了你可以找到的Perl控制台 http://www.sukria.net/perlconsole.html.

希望这可以帮助!


Cli*_*rce 14

您可以随时进入内置调试器并从那里运行命令.

   perl -d -e 1
Run Code Online (Sandbox Code Playgroud)


Eri*_*son 12

有两种流行的Perl REPL.
1.开发:: REPL很棒.
但IMO 答复更好.

  • +1用于推荐回复.当我在IRC上询问一个好的Perl REPL(控制台)时,Devel :: REPL的作者自己建议回复它自己的解决方案.回复还附带自动完成功能,非常便于检查对象的可用方法和属性.我可以使用以下命令在Ubuntu上安装Reply:`sudo apt-get install libreply-perl`.然后只需在终端输入`reply`即可运行. (6认同)

mkl*_*nt0 12

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

它的重点是自动结果打印,方便的文档查找以及对常规表达式匹配的轻松检查.
你可以在这里看到截图.

独立工作(没有Perl本身以外的依赖项),但强烈建议安装rlwrap以支持命令行编辑,持久命令历史记录和制表符完成 - 请在此处阅读更多内容.

安装

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

    npm install -g perli
    
    Run Code Online (Sandbox Code Playgroud)
  • 除此以外:

    • Unix的样平台:下载这个脚本perli在你的系统路径的文件夹,并使其可执行文件chmod +x.

    • 视窗:下载这个脚本perli.pl(注意.pl扩展名)在系统中的路径的文件夹.
      如果你不介意调用Perli perli.pl,那么你已经完成了.
      否则,perli.cmd使用以下内容创建在同一文件夹中命名的批处理文件:@%~dpn.pl %*; 这使得调用成为公正perli.

  • @sdkks:如果您发现问题,请[在 GitHub 上报告](https://github.com/mklement0/perli/issues),我会尝试修复它。`perli` 已经有一段时间没有更新了,因为在我个人使用中我没有遇到任何问题,而且其他人似乎很少使用它,但是,据我所知,它仍然可以像宣传的那样工作。 (3认同)
  • 我报告了一个问题,@mklement0 已修复该问题,并在不到 24 小时内发布了新版本,FWIW。:) (3认同)
  • 我喜欢它可以从 `perli` REPL 启动 `perldoc`,比如 `'someCommand ?'`。不过好像好久没更新了,你还在维护perli吗? (2认同)

Bri*_*ips 6

perl -d 是你的朋友:

% perl -de 0
Run Code Online (Sandbox Code Playgroud)


小智 6

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

它是一个完整的 shell(例如,你可以用它来代替 bash),但使用 perl 语法..所以你可以即时创建方法等。


小智 6

来自Devel :: REPL的re.pl


yst*_*sth 6

我一直这样做:

rlwrap perl -wlne'eval;print$@if$@'
Run Code Online (Sandbox Code Playgroud)

使用5.10,我切换到:

rlwrap perl -wnE'say eval()//$@'
Run Code Online (Sandbox Code Playgroud)


Mic*_*man 5

Perl 没有控制台,但调试器可以用作其中之一。在命令提示符下,键入perl -de 1。(值“1”无关紧要,它只是一个什么都不做的有效语句。)

Perl shell也有几个选项。

有关更多信息,请阅读perlfaq3


KIM*_*oon 5

读取 - 评估 - 打印循环:

$ perl -e'while(<>){print eval,"\n"}'
Run Code Online (Sandbox Code Playgroud)


mkl*_*nt0 5

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

\n\n

事后看来:

\n\n
    \n
  • 现有答案中提到的第三方解决方案要么安装起来很麻烦,要么如果没有不平凡、不明显的额外步骤就无法工作——一些解决方案似乎至少被放弃了一半。
  • \n
  • 可用的 REPL 需要 readline 库来提供命令行编辑键盘支持和历史记录支持- 确保这对许多第三方解决方案来说是一个麻烦点。
  • \n
  • 如果您安装 CLI rlwrap,它为任何命令提供 readline 支持,则可以将其与简单的 Perl 命令结合起来创建可用的 REPL,从而无需第三方 REPL 解决方案。\n\n
      \n
    • 在 OSX 上,您可以rlwrap通过Homebrew进行安装brew install rlwrap
    • \n
    • Linux 发行版应rlwrap通过各自的包管理器提供;例如,在 Ubuntu 上,使用sudo apt-get install rlwrap.
    • \n
    • 请参阅J\xc3\xa1n S\xc3\xa1ren\xc3\xadk\ 的答案,rlwrap了解Perl 命令的所述组合。
    • \n
  • \n
\n\n
\n\n

J\xc3\xa1n\ 的答案没有得到什么:

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

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

\n\n
    \n
  • 大约 2.5 年没有出现任何活动

  • \n
  • 它的重点有所不同,因为它的目标是成为一个成熟的shell 替代品,因此工作方式与传统 shell 类似,这意味着它不会自动将命令评估为Perl语句,并且需要显式输出命令,例如print打印表达式的结果。

  • \n
\n\n
\n\n

J\xc3\xa1n S\xc3\xa1ren\xc3\xadk\ 的答案可以通过一种方式改进:

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

如果您以一次性操作的方式安装该Data::Printer模块,则可以将其加载到 REPL 中以使用该函数,您可以向该函数传递列表/数组/哈希表以进行枚举。[sudo] cpan Data::Printerp()

\n\n

这是一个用 readline 和support命名的别名iperlData::Printer,您可以将其放入类 POSIX shell 的初始化文件中(例如~/.bashrc):

\n\n
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()//$@\'\\\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
$ iperl        # start the REPL\niperl> p %ENV  # print key-value pairs in hashtable %ENV\n
Run Code Online (Sandbox Code Playgroud)\n\n

与 J\xc3\xa1n\ 的答案一样,表达式的标量结果会自动打印;例如:

\n\n
iperl> 22 / 7  # automatically print scalar result of expression: 3.14285714285714\n
Run Code Online (Sandbox Code Playgroud)\n


Dav*_*nic 5

Matt Trout 的概述列出了五个选择,从perl -de 0开始,Reply如果通过插件的可扩展性很重要,他建议从 开始,或者tinyrepl从 开始Eval::WithLexicals,选择一个最小的、纯 Perl 解决方案,包括 readline 支持和词法持久性。

如果您使用 GNU Guix 包管理器,您可以使用以下命令进入 tinyrepl 的工作环境:

$ guix shell perl perl-eval-withlexicals perl-term-readline-gnu
[env]$ tinyrepl
re.pl$ 'hello world!'
"hello world!"
Run Code Online (Sandbox Code Playgroud)