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

时间:2010-01-22 01:51:37

标签: ruby perl

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

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

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

8 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

使用Ruby的exec()

ruby​​pl.rb

#!/usr/bin/ruby -w

script = 'perlscript.pl'
exec("/usr/bin/perl #{script}")

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);
}

答案 2 :(得分:3)

以下是ruby如何使用python脚本,与脚本的stdin和stdout进行交互。

foo.py从标准输入读取两个整数(每个都在它自己的行上),添加它们,并将结果写入标准输出。我不懂perl,所以对我好:

#!/usr/bin/perl

$a = <STDIN>;
$b = <STDIN>;
$c = int($a) + int($b);
print $c;

foo.rb执行foo.py,给它添加两个数字,取回结果并打印出来:

#!/usr/bin/ruby1.8

a = 1
b = 2
c = IO.popen('./foo.py', 'w+') do |pipe|
  pipe.puts(a)
  pipe.puts(b)
  pipe.close_write
  pipe.read
end
raise "foo.py failed" unless $? != 0
print "#{a} + #{b} = #{c}"    # => 1 + 2 = 3

答案 3 :(得分:3)

perldoc perlipc州:

DESCRIPTION
       The basic IPC facilities of Perl are built out of the good old Unix
       signals, named pipes, pipe opens, the Berkeley socket routines, and
       SysV IPC calls.  Each is used in slightly different situations.

Ruby能够运行其中的每一个。

答案 4 :(得分:2)

Perl和Ruby都有各种“胶水”。使用Expect模块的Perl程序可以做的不仅仅是“等待输出”。更有可能的是,你可以使用像HTTP这样的知名协议进行通信...... Ruby守护进程可以建立一个监听器,Perl可以联系它,反之亦然。

但不,你不能只将“ruby”嵌入到Perl中,反之亦然。你必须运行单独的流程并以某种方式进行沟通。

答案 5 :(得分:2)

试试Open4。它不是专门用于与perl进行交互,而是用于任何需要输入和输出的程序。我还在学习使用它,但我觉得它可能适合你的需要。

答案 6 :(得分:2)

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

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

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

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

抱歉,我没有更具体的内容。它将成为一个伟大的CPAN模块。

答案 7 :(得分:0)

您在其中一条评论中提到过要在Ruby中运行Perl代码。除非您可以使Ruby解释器理解Perl语法,否则这将无效。 Can I get a BNF/yacc/RE for the Perl language?将帮助您了解您将面临的挑战。

相关问题