代码之家  ›  专栏  ›  技术社区  ›  Mike

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

  •  6
  • Mike  · 技术社区  · 16 年前

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

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

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

    8 回复  |  直到 14 年前
        1
  •  2
  •   Schwern    16 年前

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

    在一般层面上,最接近你想要的是 XDebug . 它将一个进程变成一个小型服务器,接受调试命令。这通常用于调试和分析,而不是进程间通信,但也有可能。我相信ActiveState的Perl可以作为XDebug服务器运行。

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

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

    对不起,我没有更具体的。这将是一个伟大的CPAN模块。

        2
  •  5
  •   mob    16 年前

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

    编辑 Inline::Ruby 上一次更新是在2002年,当时v5.6是最新的稳定版本。文件说它只在Linux上测试过;我试图在Cygwin上将其与v5.10.1一起使用。在对模块附带的XS/C代码进行了一些黑客攻击之后,它得以构建。通过了一些单元测试,但其他单元测试失败。似乎导入了Ruby class ,但导入独立函数不太成功。小结:如果您需要一个快速而肮脏的Perl和Ruby桥接器,

        3
  •  5
  •   user198470    16 年前

    使用Ruby的exec()

    rubypl.rb

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

    #!/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);
    }
    
        4
  •  3
  •   user240438 user240438    16 年前

    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能够操作其中的每一个。

        5
  •  3
  •   Wayne Conrad    16 年前

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

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

    #!/usr/bin/perl
    
    $a = <STDIN>;
    $b = <STDIN>;
    $c = int($a) + int($b);
    print $c;
    

    #!/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
    
        6
  •  2
  •   Randal Schwartz    16 年前

    Perl和Ruby都有不同的“胶水”。使用 Expect 模块可以做的不仅仅是“等待输出”。不过更可能的是,您可以使用HTTP之类的知名协议进行通信。。。Ruby守护进程可以建立一个侦听器,Perl可以联系它,反之亦然。

        7
  •  2
  •   pierrotlefou    16 年前

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

    推荐文章