你如何与Ruby的Perl程序交互?

Mik*_*ike 6 ruby perl

我的理解是Ruby和Perl之间没有"桥梁"让你直接从Ruby调用Perl函数.这也是我的理解,从Ruby调用Perl程序,你只需将它放在反引号中(即result = `./helloWorld.pl`).但是,这不允许与Perl程序交互(即,您无法与提示交互或提供输入).我的问题如下:

  1. 有没有办法从Ruby提供输入到Perl程序(除了参数)?

  2. 我错了,Ruby和Perl之间没有桥梁吗?在导航提示时,与程序的stdin进行交互似乎是错误的方法,我正在处理的程序设计良好,并且库中包含适当的Perl函数.

mob*_*mob 5

Inline :: Ruby模块,虽然我没有任何直接的经验,我可以分享.

编辑:我昨晚试了一下 - 这是评论:Inline::Ruby最新更新于2002年,当时v5.6是最新的稳定版本.Docs说它只在Linux上测试过; 我试图在Cygwin上使用v5.10.1.在对模块附带的XS/C代码进行一些黑客攻击之后构建它.通过了一些单元测试,但其他人失败了.似乎将Ruby导入class到Perl的命名空间中,但导入独立函数的效果较差.简介:如果你需要一个快速而又脏的Perl和Ruby桥接器,Inline::Ruby可能会让你失望.如果您有耐心了解如何在系统上构建模块,并按摩Ruby代码以使用模块,您会发现它很有用.


use*_*470 5

使用Ruby的exec()

rubypl.rb

#!/usr/bin/ruby -w

script = 'perlscript.pl'
exec("/usr/bin/perl #{script}")
Run Code Online (Sandbox Code Playgroud)

perlscript.pl

#!/usr/bin/perl -w
use strict;
print "Please enter your name: ";
my $name = <STDIN>;
chop($name);
if ($name eq "")
{
    print "You did not enter a name!\n";
    exit(1);
} else {
    print "Hello there, " . $name . "\n";
    exit(0);
}
Run Code Online (Sandbox Code Playgroud)


Sch*_*ern 2

据我所知,你想要的东西并不存在。

在通用级别上,最接近您想要的东西是XDebug。它将一个进程变成一个接受调试命令的小服务器。这通常用于调试和分析,而不是用作进程间通信,但它是一种可能性。我相信 ActiveState 的 Perl 可以作为 XDebug 服务器运行。

否则,您需要在 Perl 程序侦听命令的某种侧通道中显式编程(这就是 XDebug 所做的)。它可以像打开一个读取字符串的套接字一样简单,对其进行评估,将结果编码为 YAML(或其他)并将其写回。一个 REPL,但在套接字上而不是在终端上。

显然,存在安全隐患,这将作为读者的练习。您也不希望监听套接字来中断程序,因此您现在需要事件驱动或线程化的东西。

抱歉,我没有更具体的信息。它将成为一个很棒的 CPAN 模块。