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

3
此帖讨论了一种在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脚本。

1
是的,同样的技巧(heredocs)也适用。还可以查看所谓的“一行代码”选项 -e-E - amon
如果您描述您想要做什么,会更有帮助。您是否想从 Perl 脚本中运行 Python 代码?这是我根据您所写的内容的最佳猜测。 - Borodin
@Borodin 我对原帖进行了重大更新,请告诉我现在是否清晰明了。 - Amelio Vazquez-Reina
2个回答

4
看起来你对Inline模块很感兴趣。它允许Perl调用许多其他语言中的代码,并依赖于每种语言的支持模块。
虽然你没有说你想做什么,但你提到了Python,有一个Inline::Python模块。

@abarnert 我更新了原帖。希望问题现在更加清晰明了。开始时我的问题有些令人困惑,抱歉。 - Amelio Vazquez-Reina
1
如果你想在Python和Perl之间共享变量,通常的方法是调用一个带有你的Perl变量或反之的Python函数。文档对此进行了很好的解释,并提供了许多示例。如果你需要访问全局变量,这会更棘手(每个方向的原因不同),但文档也展示了如何做到这一点,所以首先阅读文档,然后再提出任何具体问题。 - abarnert
@abarnert:有人给了你+1,但我不知道你所说的“使用你的Perl变量调用Python函数”的意思。请解释一下,因为我只是凡人。 - Borodin
从您更新的问题来看,似乎您需要像我在答案中提供的 Inline::Python。我仍然不确定您所说的“在 Perl 脚本上键入”的意思,但我仍然支持使用该模块。 - Borodin
@abarnet:如果你的意思是*Inline::Python是做什么的,那就没问题了。但我的问题在于你所说的"通常的方法",因为没有一种通常的方法可以从Perl中运行Python。除此之外,你的"解决方案"似乎是对OP问题的重申。他可能也会问"如何使用[我的]Perl变量调用Python函数?"*。 - Borodin
显示剩余4条评论

2

是的,同样的技术(here-docs)也可以用于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
太好了。感谢amon和@Borodin。那么在Python和Perl之间共享变量怎么样(请参见我的更新的原帖)? - Amelio Vazquez-Reina
@user815423426:第二个跟进应该放在Borodin的答案下面,而不是这个。 - abarnert
@abarnert:你让一个有点模糊的问题变得更加模糊了,这是有罪的。请不要提供更多理解问题的方式,我们需要等待OP自己解释清楚。 - Borodin
@Borodin:OP明确说了“如何在Python和Perl之间共享变量”,所以我认为现在已经不再模糊了,他想要从Perl中运行Python代码,而不仅仅是Bash代码。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接