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

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

147665 次浏览

perl -d是你的朋友:

% perl -de 0

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

   perl -d -e 1

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

在谷歌搜索了一下之后,有一个单独的项目实现了Perl控制台,您可以在 Perl控制台- Perl代码与完成的交互式计算器 . < / p >

希望这能有所帮助!

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

perl -de1

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

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

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

然后我可以使用我的bash历史来获得旧的命令。然而,这并不能保存状态。

当您想测试“一件小事”(比如回答Perl问题)时,这个表单最有用。我经常发现这些命令被逐字逐句地复制到shell脚本或makefile中。

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

这是一个完整的shell(你可以用它来代替bash),但使用perl语法。你可以动态地创建方法。

Perl没有控制台,但是调试器可以作为控制台使用。在命令提示符下,键入perl -de 1。(值"1"没关系,这只是一个有效的陈述,没有任何作用。)

对于Perl shell,还有几个选项 存档“perlfaq3"页面包含问题“有Perl Shell吗?” < / p >

有关更多信息,请阅读perlfaq3(当前版本)。

我想你是在问perl的REPL(读取,计算,打印,循环)接口。有几种方法可以做到这一点:

  • Matt Trout有一篇文章描述了如何写一个
  • 阿德里亚诺·费雷拉
  • 最后,你可以在irc.perl.org上登陆IRC,并在许多流行的频道中尝试其中一个评估机器人。他们会计算你传递给他们的perl代码块。

Matt Trout不仅写了一篇关于REPL的文章,他实际上写了一个——猛击: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

re.pl来自Devel::REPL

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

我总是这样做:

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

使用5.10,我已经切换到:

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

(rlwrap是可选的)

Read-eval-print循环:

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

如果你需要历史记录,使用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 repl。

  1. 猛击:REPL是伟大的。
  2. 但是在我看来回复更好。

更新:我已经创建了一个可下载的REPL -见我的另一个答案

事后看来:

  • 在现有的答案中提到的第三方解决方案要么是如果没有不平凡、不明显的额外步骤,安装和/或工作起来就会很麻烦 -一些解决方案似乎至少被放弃了一半。
  • 一个可用的REPL需要readline库来支持命令行编辑键盘和历史记录 -确保这是许多第三方解决方案的一个麻烦点。
  • 如果你安装CLI rlwrap提供了对任何命令的readline支持,你可以将它与一个简单的Perl命令结合起来创建一个可用的REPL,因此没有第三方REPL解决方案。
    • 在OSX上,你可以通过家酿brew install rlwrap安装rlwrap
    • Linux发行版应该通过它们各自的包管理器提供rlwrap;例如,在Ubuntu上,使用sudo apt-get install rlwrap
    • 参见Ján Sáreník的答案rlwrap和Perl命令的组合。
    • 李< / ul > < / >

    你得不到什么与Ján的答案:

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

    提供这些功能的唯一第三方解决方案是psh(具有非平凡的安装+额外的、不明显的步骤),但是:

    • 它已经有大约两年半没有活动了

    • 它的重点是不同的,它的目标是成为一个功能完善的shell replacement,因此像传统的shell一样工作,这意味着它不会自动将命令计算为Perl语句,并且需要显式的输出命令,如print来打印表达式的结果。


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

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

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

    这是一个别名__ABC0,具有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; e.g.: `p %ENV`"; } say eval()//$@'\'
    

    例如,你可以执行以下操作,通过哈希表%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
    

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

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

它工作在独立的(除了Perl本身没有依赖关系),但工作在强烈建议安装rlwrap,因此支持命令行编辑、持久命令历史和制表符补全-阅读更多在这里

安装

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

    npm install -g perli
    
  • Otherwise:

    • Unix-like platforms: Download this script as perli to a folder in your system's path and make it executable with chmod +x.

    • Windows: Download the this script as perli.pl (note the .pl extension) to a folder in your system's path.
      If you don't mind invoking Perli as perli.pl, you're all set.
      Otherwise, create a batch file named perli.cmd in the same folder with the following content: @%~dpn.pl %*; this enables invocation as just perli.

在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,如果通过插件的可扩展性很重要,或者Eval::WithLexicalstinyrepl,这是一个最小的纯perl解决方案,包括readline支持和词汇持久性。

你可以在网上做这件事(就像生活中的许多事情一样):

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

你可以在emacs中使用org-babel;打开一个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将计算块:

#+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模块。