Как можно взаимодействовать с программами Perl от Ruby?

Это - мое понимание, что нет никакого "моста" между Ruby и Perl для разрешения, Вы звонить в Perl функционируете непосредственно от Ruby. Это - также мое понимание, что для вызова программы Perl от Ruby Вы просто помещаете его в обратные галочки (т.е. result = `./helloWorld.pl`). Однако это не позволяет взаимодействие с программой Perl (т.е. Вы не можете взаимодействовать с подсказками или обеспечить вход). Мои quesitons следующие:

  1. Там какой-либо путь состоит в том, чтобы предоставить вход программам Perl от Ruby (кроме аргументов)?

  2. Я неправильно, что нет никакого моста между Ruby и Perl? Взаимодействие с stdin программы походит на неправильный способ пойти при навигации по подсказкам, и программы, с которыми я имею дело, хорошо разработаны и имеют библиотеки с соответствующими функциями Perl в них.

6
задан user151019 10 June 2012 в 09:48
поделиться

8 ответов

То, что вы хотите, на самом деле не существует, для моих знаний.

Самая близкая вещь к тому, что вы хотите, на общем уровне, это xDebug . Он превращает процесс на небольшой сервер, который примет отладку команд. Это обычно используется для отладки и профилирования, а не в качестве общения интерпретирования, но его возможность. Я считаю, что Perl ActiveState может управляться как сервер XDeBug.

В противном случае вам нужна явная программа в каком-либо боковом канале, что ваша программа PERL слушает команды (которая имеет значение xdebug). Это может быть так же просто, как открытие розетки, которое читает строку, уклоняется от него, кодирует результат как yaml (или что-то еще) и записывает его обратно. Refl, но на розетке, а не на терминале.

Есть, очевидно, последствия безопасности, которые будут оставлены как упражнение для читателя. Вы также не хотите слушать сокет, чтобы прервать программу, чтобы вам теперь понадобится что-то, управляемое событиями или резьбами.

Извините, у меня нет ничего более конкретного. Это сделало бы большой модуль CPAN.

2
ответ дан 8 December 2019 в 05:55
поделиться

Есть встроенный модуль :: Ruby Модуль, хотя у меня нет прямого опыта, который я могу поделиться.

Редактировать : Я пробовал прошлой ночью - вот обзор: Встроенный :: Ruby был в последний раз обновлен в 2002 году, когда V5.6 был последний стабильный выпуск. Документы говорят, что это было проверено только на Linux; Я пытался использовать его с v5.10.1 на Cygwin. Получил это, чтобы построить после какого-либо взлома кода XS / C, который поставляется с модулем. Прошел несколько модульных тестов, но не удалось другим. Казалось, импортировать Ruby класс в пространство имен Perl ok, но было менее успешно импортирующим автономным функциям. Резюме: Если вам нужен быстрый и грязный мост для Perl и Ruby, INLINE :: Ruby , вероятно, разочарует вас. Если у вас есть терпение, чтобы выяснить, как построить модуль в вашей системе, и массировать свой Ruby-код для работы с модулем, вы можете найти его полезным.

5
ответ дан 8 December 2019 в 05:55
поделиться

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 способен работать каждый из них.

3
ответ дан 8 December 2019 в 05:55
поделиться

Вот как рубин можно использовать питон скрипт, взаимодействуя с стандартным вводом скрипта и стандартным выводом.

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
ответ дан 8 December 2019 в 05:55
поделиться

Perl и Ruby имеют различные «клеи». Программы Perl, использующие модуль модуль , могут сделать намного больше, чем просто «ждать вывода». Более вероятно, что вы могли бы общаться с известным протоколом, таким как http ... Ребимон Ruby может поставить слушателя, а Perl может связаться с ним или наоборот.

Но нет, вы не можете просто «вставить» ruby ​​Code в Perl или наоборот. Вы должны запустить отдельные процессы и как-то общаться.

2
ответ дан 8 December 2019 в 05:55
поделиться

Попробуйте Open4 . Он не предназначен для взаимодействия с Perl, но с любой программой, которая нуждается в входе и выпуске. Я все еще учиюсь использовать его, но я чувствую, что это может удовлетворить вашу потребность.

2
ответ дан 8 December 2019 в 05:55
поделиться

Вы упомянули в одном из ваших комментариев, которые вы хотите запустить код Perl внутри Ruby. Это не будет работать, если вы не сможете сделать переводчик Ruby понять синтаксис Perl. Могу ли я получить BNF / YACC / RE для языка Perl? поможет вам понять проблемы, с которыми вы столкнетесь.

0
ответ дан 8 December 2019 в 05:55
поделиться

Использование Ruby's Exec ()

RUBYPL.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);
}
5
ответ дан 8 December 2019 в 05:55
поделиться