在 Perl 脚本上使用另一个解释器运行代码

Posted

技术标签:

【中文标题】在 Perl 脚本上使用另一个解释器运行代码【英文标题】:Running code with another interpreter on a Perl script 【发布时间】:2013-04-30 23:07:11 【问题描述】:

This thread 讨论了一种在 Bash 脚本中运行 Python 代码的方法。

有没有办法在 Perl 脚本中做类似的事情?即,有没有办法运行在 Perl 脚本上键入的 Python 代码? 请注意,我不是在询问从 Perl 脚本运行 Python 文件。我问的是直接在具有 Perl 脚本的同一文件中运行 Python 代码(就像另一个线程讨论如何从 Bash 脚本运行 Perl 代码一样)。

例子:

# /bin/perl
use 5.010
my $some_perl_variable = 'hello';


# ... BEGIN PYTHON BLOCK ...
# We are still in the same file. But we are now running Python code
import sys;
print some_perl_variable # Notice that this is a perl variable
for r in range(3):
  print r
# ... END PYTHON BLOCK ...

say "We are done with the Perl script!" 
say "The output of the Python block is:"
print $output" 
1; 

应该打印:

We are done with the Perl script! 
The output of the Python block is: 
hello
1
2 
3

我们已经完成了 perl 脚本

【问题讨论】:

是的,同样的技术(heredocs)也适用。另请参阅所谓的“单线”的 -e-E 选项。 如果你描述了你想做的事情会有所帮助。您想从 Perl 脚本中运行 Python 代码吗?这是我对你所写内容的最佳猜测。 @Borodin 我显着更新了 OP。如果还不清楚,请告诉我。 【参考方案1】:

听起来您会对Inline 模块感兴趣。它允许 Perl 调用许多其他语言的代码,并依赖于每种语言的支持模块。

你没有说你想做什么,但是你提到了 Python 并且有一个Inline::Python

【讨论】:

啊,但是 Inline::Python 可以运行 OP 害怕的“存在于文件中”的 python 代码。当然,它也可以(并且更常见)运行存在于字符串中和/或直接内联在 perl 脚本中的 python 代码(因此得名)——但即使在这些情况下,perl 脚本通常存在于文件中,所以除非python是动态生成的……即使那样,内存基本上也是一个文件(字面意思是,在linux上)。我认为唯一的解决方案是确保 python 代码永远不会存在。 :) 或者,更严重的是……是的,你猜对的可能性似乎是 50/50,即使你没有猜对,它也可能是一个有用的答案,所以绝对 +1。 @abarnert 我更新了 OP。我希望问题现在更清楚了。抱歉,我的问题一开始就令人困惑。 @user815423426:如果您想在 Python 和 Perl 之间共享变量,通常的方法是使用您的 Perl 变量调用 Python 函数,反之亦然。文档很好地解释了这一点,并给出了很多例子。如果您需要访问全局变量,则比较棘手(由于每个方向的原因不同),但文档也显示了这一点,因此请先阅读它们,然后提出任何具体问题。 @abarnert:有人给了你+1,但我不知道你所说的“用你的Perl变量调用Python函数”是什么意思。请解释一下,因为我只是凡人【参考方案2】:

是的,Perl 可以使用相同的技术(此处为文档)。

Bash 中的 Perl:

perl <<'END' # note single quotes to avoid $variable interpolation
use 5.010;
say "hello world";
END

perl -E'say "hello from perl"'

Perl 中的 Bash:

use autodie; # less error handling
open my $bash, "|-", "bash";
print $bash <<'END'; # single quotes again
echo hello from bash
END

Perl 中的 Bash 中的 Perl:

use autodie; # less error handling
open my $bash, "|-", "bash";
print $bash <<'END'; # single quotes again
perl <<'INNER_END'
 use 5.010;
 say "hello inception";
INNER_END
END

(讽刺的是,我在另一个heredoc 中的命令行上测试过)

【讨论】:

您可能是对的:他只是想将 Perl 代码放入 Bash 脚本中。在这种情况下,应该对问题进行不同的标记:-/直到他停止对此事保持沉默,我们才会知道 太棒了。谢谢阿蒙和@Borodin。在 Python 和 Perl 之间共享变量怎么样(参见我更新的 OP) @user815423426:第二个后续属于鲍罗丁的回答,而不是这个。 @abarnert:你让一个有点模棱两可的问题变得更加模棱两可。拜托,我们不需要更多种方式来理解这个问题,我们需要等到OP解释自己。 @Borodin:OP 专门说“如何在 Python 和 Perl 之间共享变量”,所以我认为他想从 Perl 运行 Python 代码,而不仅仅是 Bash 代码已经不再模棱两可了。跨度>

以上是关于在 Perl 脚本上使用另一个解释器运行代码的主要内容,如果未能解决你的问题,请参考以下文章

我可以确保在 5.10+ 上编写的 Perl 代码可以在 5.8 上运行吗?

把perl脚本编译成exe

/usr/bin/perl:错误的解释器:文本文件忙

Apache服务器中运行CGI程序的方法,文中以Perl脚本作为示例

使用Perl执行Python脚本时,为什么不会出现语法错误?

perl 解释器的状态码是啥意思?