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

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

How can I start an interactive console for Perl?

如何为Perl启动交互式控制台,类似于Ruby的irb命令或Python的python命令?


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

1
perl -de1

另外,还有Alexis Sukrieh的Perl Console应用程序,但我没有使用过。


马特·特劳特(Matt Trout)不仅写了一篇关于REPL的文章,还写了一篇-Devel :: REPL

我已经使用了一段时间,并且效果很好,并且正在积极开发中。

顺便说一句,我不知道为什么有人从控制台使用" perl -e"来修饰提到的人。确实,这不是真正的REPL,但是它非常有用,我一直在使用它。


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

1
2
3
4
5
6
7
8
#! /usr/bin/perl

while (<>) {
  chomp;
  my $result = eval;
  print"$_ = $result
"
;
}

无论您输入什么,它都会在Perl中求值:

1
2
3
4
5
6
7
8
9
10
11
> 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

1
2
3
#!/bin/sh
echo 'This is Interactive Perl shell'
rlwrap -A -pgreen -S"perl>" perl -wnE'say eval()//$@'

这是这样的:

1
2
3
4
5
$ ips
This is Interactive Perl shell
perl> 2**128
3.40282366920938e+38
perl>


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

  • Matt Trout的文章描述了如何编写一个
  • 阿德里亚诺·费雷拉(Adriano Ferreira)描述了一些选择
  • 最后,您可以在irc.perl.org上跳至IRC,并尝试许多流行频道中的评估机器人之一。他们将评估您传递给他们的perl块。

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

1
2
$ perl -e 'print"JAPH
"'

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

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


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

进行一些谷歌搜索之后,有一个单独的项目实现了Perl控制台,您可以在http://www.sukria.net/perlconsole.html上找到它。

希望这可以帮助!


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

1
   perl -d -e 1

有两种流行的Perl REPL。

  • Devel :: REPL很棒。
  • 但是,IMO的答复更好。

  • 我创建了perli,这是一个可在Linux,macOS和Windows上运行的Perl REPL。

    它的重点是自动结果打印,方便的文档查找以及简便的操作
    检查正则表达式匹配项。
    您可以在此处查看屏幕截图。

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

    安装

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

      1
      npm install -g perli
    • 除此以外:

      • 类似于Unix的平台:将该脚本作为perli下载到系统路径中的文件夹中,并使其可以通过chmod +x执行。

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


    来自Devel:.REPL的re.pl


    perl -d是您的朋友:

    1
    % perl -de 0

    我总是这样做:

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

    使用5.10,我已切换到:

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

    读评估打印循环:

    1
    2
    $ perl -e'while(<>){print eval,"
    "}'


    Perl没有控制台,但是调试器可以用作控制台。在命令提示符下,键入perl -de 1。 (值" 1"无关紧要,它只是不执行任何操作的有效语句。)

    Perl shell也有两个选项。

    有关更多信息,请阅读perlfaq3。


    您可以在此处查看psh:http://gnp.github.io/psh/

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


    在Debian / Ubuntu下:

    1
    2
    3
    4
    5
    $ sudo apt-get install libdevel-repl-perl
    $ re.pl

    $ sudo apt-get install libapp-repl-perl
    $ iperl

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

    事后看来:

    • 现有答案中提到的第三方解决方案要么安装麻烦,和/或如果没有非平凡,非显而易见的附加步骤就无法工作-有些解决方案似乎至少被放弃了。
    • 可用的REPL需要readline库来提供命令行编辑键盘支持和历史记录支持-确保这是许多第三方解决方案的麻烦点。
    • 如果安装CLI rlwrap,该命令行提供对任何命令的读取行支持,则可以将其与简单的Perl命令结合使用,以创建可用的REPL,从而无需第三方REPL解决方案。

      • 在OSX上,可以通过Homebrew和brew install rlwrap安装rlwrap
      • Linux发行版应通过各自的软件包管理器提供rlwrap;例如,在Ubuntu上,使用sudo apt-get install rlwrap
      • 有关rlwrap和Perl命令的所述组合,请参见JánSáreník的答案。

    Ján的答案不会给您带来什么:

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

    提供这些功能的唯一第三方解决方案(非简单安装+附加,非显而易见的步骤)是psh,但是:

    • 它已经有2.5年没有活动了

    • 它的关注点有所不同,因为它的目标是完全替换shell,因此像传统的shell一样工作,这意味着它不会自动将命令评估为Perl语句,而是需要显式的输出命令,例如< x6>以打印表达式的结果。

    JánSáreník的答案可以通过以下一种方法加以改进:

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

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

    这是一个名为iperl的别名,具有readline和Data::Printer支持,您可以将其放入类似POSIX的shell的初始化文件(例如~/.bashrc)中:

    1
    alias iperl='rlwrap -A -S"iperl>" perl -MData::Printer -wnE '\''BEGIN { say"# Use `p @` or `p %<hashTable>` to print arrays/lists/hashtables; e.g.: `p %ENV`"; } say eval()//$@'\'

    例如,然后您可以执行以下操作以通过哈希表%ENV打印所有环境变量:

    1
    2
    $ iperl        # start the REPL
    iperl> p %ENV  # print key-value pairs in hashtable %ENV

    与Ján的答案一样,表达式的标量结果会自动打印出来;例如。:

    1
    iperl> 22 / 7  # automatically print scalar result of expression: 3.14285714285714

    Matt Trout的概述列出了从perl -de 0开始的五个选择,如果推荐通过插件的可扩展性很重要,则建议使用Reply,或者从Eval::WithLexicals推荐tinyrepl,以获得最小的纯perl解决方案,其中包括readline支持和词汇坚持不懈。


    棕褐色和PDE也有自己的REPL(对于GNU Emacs)。


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


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


    推荐阅读