289

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

4

24 回答 24

326

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

perl -de1

或者,还有Alexis Sukrieh的 Perl Console应用程序,但我没有使用它。

于 2008-09-16T15:38:53.260 回答
66

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

我已经使用了一点,它工作得相当好,而且它正在积极开发中。

顺便说一句,我不知道为什么有人修改了从控制台中提到使用“perl -e”的人。这不是真正的 REPL,没错,但它非常有用,而且我一直都在使用它。

于 2008-09-16T16:16:11.047 回答
40

我写了一个我称之为“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
于 2008-09-16T19:44:29.363 回答
34

如果您想要历史记录,请使用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> 
于 2014-04-03T14:07:39.263 回答
23

我认为您是在询问 perl 的 REPL(读取、评估、打印、循环)接口。有几种方法可以做到这一点:

  • Matt Trout 有一篇文章描述了如何写一个
  • Adriano Ferreira描述了一些选项
  • 最后,您可以在 irc.perl.org 上访问 IRC,并在许多流行频道中试用其中一个 eval 机器人。他们将评估您传递给他们的 perl 块。
于 2008-09-16T15:57:19.643 回答
20

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

$ perl -e 'print "JAPH\n"'

然后我可以使用我的bash历史记录来取回旧命令。但是,这不会保留状态。

当你想测试“一件小事”时(比如回答 Perl 问题),这种形式最有用。通常,我发现这些命令被逐字提取到 shell 脚本或 makefile 中。

于 2008-09-16T15:42:39.287 回答
19

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

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

希望这可以帮助!

于 2008-09-16T15:38:36.893 回答
15

您始终可以直接进入内置调试器并从那里运行命令。

   perl -d -e 1
于 2008-09-16T15:37:59.890 回答
15

有两种流行的 Perl REPL。

  1. Devel::REPL很棒。
  2. 但IMO回复更好。
于 2015-02-06T18:49:29.943 回答
14

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

它的重点是自动结果打印、方便的文档查找和正则表达式匹配的简单检查。你可以在这里
看到截图。

它可以独立工作(除了 Perl 本身之外没有其他依赖项),但强烈建议安装rlwrap它以支持命令行编辑、持久命令历史记录和制表符补全 -在此处阅读更多信息。

安装

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

    npm install -g perli
    
  • 除此以外:

    • 类 Unix平台:将此脚本下载到系统路径中perli的文件夹中,并使用chmod +x.

    • Windows将此脚本作为perli.pl(注意.pl扩展名)下载到系统路径中的文件夹中。
      如果您不介意将 Perli 调用为perli.pl,则一切就绪。否则,在同一文件夹中
      创建一个批处理文件,内容如下: ; 这使得调用只是.perli.cmd@%~dpn.pl %*perli

于 2015-09-26T14:01:54.627 回答
7

perl -d是你的朋友:

% perl -de 0
于 2008-09-16T15:37:37.677 回答
7

来自 Devel::REPL 的 re.pl

于 2008-09-17T07:45:32.717 回答
7

我总是这样做:

rlwrap perl -wlne'eval;print$@if$@'

在 5.10 中,我切换到:

rlwrap perl -wnE'say eval()//$@'

(rlwrap 是可选的)

于 2008-09-18T10:48:08.713 回答
6

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

它是一个完整的 shell(例如,您可以使用它来代替 bash),但使用 perl 语法..因此您可以动态创建方法等。

于 2008-09-16T15:44:53.603 回答
5

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

Perl shell也有几个选项。

有关更多信息,请阅读perlfaq3

于 2008-09-16T15:46:40.400 回答
5

读取-评估-打印循环:

$ perl -e'while(<>){print eval,"\n"}'
于 2013-09-17T07:28:32.133 回答
4

更新:我已经创建了一个可下载的 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 命令的组合。

Ján 的回答你没有得到什么:

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

提供这些的唯一第三方解决方案(通过非平凡的安装 + 额外的、非显而易见的步骤)是psh,但是:

  • 大约 2.5 年没有活动了

  • 它的重点不同,它旨在成为一个成熟的shell 替代品,因此像传统的 shell 一样工作,这意味着它不会自动将命令评估为Perlprint语句,并且需要显式的输出命令,例如打印表达式的结果。


Ján Sáreník 的答案可以通过一种方式改进:

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

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

这是一个名为readline 和support的别名iperlData::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
于 2015-07-08T03:55:34.353 回答
4

在 Debian/Ubuntu 下:

$ sudo apt-get install libdevel-repl-perl
$ re.pl

$ sudo apt-get install libapp-repl-perl
$ iperl
于 2016-03-05T14:56:12.150 回答
3

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

于 2016-05-31T17:11:28.147 回答
1

还可以在 CPAN 上查找 ptkdb: http ://search.cpan.org/search?query=ptkdb&mode=all

于 2008-09-16T15:53:20.900 回答
1

Sepia 和 PDE 也有自己的 REPL(用于 GNU Emacs)。

于 2008-09-17T07:47:13.743 回答
1

另请参阅 Stylish REPL(适用于 GNU Emacs)http://blog.jrock.us/articles/Stylish%20REPL.pod

于 2008-09-18T05:54:52.897 回答
0

您可以在这里在线进行(就像生活中的许多事情一样):

https://www.tutorialspoint.com/execute_perl_online.php

于 2020-05-20T22:03:51.133 回答
0

您可以org-babelemacs; 打开一个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-ceval 块:

#+RESULTS:
#+begin_example
1, 5, 9
2, 3
2, 3
1, 2
1, 5, 9
#+end_example

我不确定这需要什么 emacs 配置,但我认为你可以安装https://github.com/hlissner/doom-emacs并启用它perlorg-mode模块。

于 2021-06-10T16:42:21.317 回答