2010-01-22 12 views
6

Tengo entendido que no existe un "puente" entre Ruby y Perl para permitirle llamar a las funciones de Perl directamente desde Ruby. También entiendo que para llamar a un programa Perl de Ruby, simplemente póngalo en los backticks (es decir, result = `./helloWorld.pl`). Sin embargo, esto no permite la interacción con el programa Perl (es decir, no puede interactuar con las solicitudes ni proporcionar entradas). Mis quesitons son los siguientes:¿Cómo puede interactuar con los programas Perl de Ruby?

  1. ¿Hay alguna manera de proporcionar información a los programas de Perl desde Ruby (aparte de argumentos)?

  2. ¿Estoy equivocado de que no haya un puente entre Ruby y Perl? La interacción con el programa de instalación de un programa parece ser la forma incorrecta de hacerlo cuando se navega por las solicitudes, y los programas con los que trato están bien diseñados y tienen bibliotecas con las funciones de Perl apropiadas.

+1

Desde sus comentarios sobre las respuestas, parece que usted está buscando algo que va a ser capaz de invocar métodos dentro de un programa Perl en ejecución para interactuar directamente con él? – Schwern

+0

Sí, deseo poder hacer algo como perlProgram.execMethod ('myPerlPethod'), y tener el espacio (hash, matrices, cadenas, números, etc.) puenteado. – Mike

Respuesta

2

Lo que quiere realmente no existe, que yo sepa.

Lo más parecido a lo que desea, en un nivel genérico, es XDebug. Convierte un proceso en un pequeño servidor que aceptará los comandos de depuración.Esto generalmente se usa para la depuración y la creación de perfiles y no como una comunicación entre procesos, pero es una posibilidad. Creo que el Perl de ActiveState se puede ejecutar como un servidor XDebug.

De lo contrario, necesita programar explícitamente en algún tipo de canal lateral que su programa Perl escuche para los comandos (que es lo que hace XDebug). Puede ser tan simple como abrir un socket que lee una cadena, lo evalúa, codifica el resultado como YAML (o lo que sea) y lo escribe de nuevo. A REPL, pero en un socket en lugar de en un terminal.

Existen, obviamente, implicaciones de seguridad que se dejarán como un ejercicio para el lector. Tampoco quiere escuchar el socket para interrumpir el programa, por lo que ahora necesitará algo impulsado por eventos o enhebrado.

Lo siento, no tengo nada más específico. Sería un gran módulo de CPAN.

2

Perl y Ruby tienen varios "pegamentos". Los programas Perl que usan el módulo Expect pueden hacer mucho más que solo "esperar a que salga". Sin embargo, es más probable que pudieras comunicarte con un protocolo conocido como HTTP ... un daemon de Ruby podría poner un oyente, y Perl podría contactarlo, o viceversa.

Pero no, no se puede simplemente "incrustar" el código Ruby en Perl, o viceversa. Tienes que ejecutar procesos separados y comunicarte de alguna manera.

+0

Entiendo que es necesario que haya pegamento, pero ¿hay software creado para manejar esto? No me importaría usar un mediador entre procesos, siempre que se haya escrito bien. (Además, me gustaría renunciar a escribir uno si es posible). – Mike

+2

Inline :: Ruby permite ejecutar código Ruby dentro del programa Perl. Y también permite llamar a los subs Perl, por lo que es posible usar Ruby como idioma principal. –

+0

Puede incrustar perl en Ruby y en cualquier otro programa de C. No es que quieras, pero Perl está diseñado para permitir eso. Yendo para otro lado, Perl tiene los módulos Inline. –

5

Existe el módulo Inline::Ruby, aunque no tengo ninguna experiencia directa con él que pueda compartir.

EDITAR: Hice probarlo anoche - aquí está la reseña: Inline::Ruby fue actualizado en 2002, cuando v5.6 fue la última versión estable anterior. Los doctores dicen que solo ha sido probado en Linux; Intentaba usarlo con v5.10.1 en Cygwin. Tengo que construir después de hackear el código XS/C que viene con el módulo. Pasó algunas pruebas unitarias pero falló en otras. Parecía importar Ruby class al espacio de nombres de Perl, pero fue menos exitoso al importar funciones independientes. Resumen: si necesita un puente rápido y sucio para Perl y Ruby, Inline::Ruby probablemente lo decepcione. Si tiene la paciencia para descubrir cómo construir el módulo en su sistema y darle un masaje a su código Ruby para que funcione con el módulo, puede encontrarlo útil.

+1

Esto es lo contrario de lo que quiero hacer: quiero ejecutar el código Perl dentro de Ruby. – Mike

+1

Mike: los módulos Inline :: generalmente permiten devoluciones de llamada al código Perl. Entonces puede ejecutar su programa Ruby desde el pequeño programa Perl. –

2

Probar Open4. No está diseñado específicamente para interactuar con perl, sino con cualquier programa que necesite entrada y salida. Todavía estoy aprendiendo a usarlo, pero creo que podría adaptarse a su necesidad.

+0

Hmm, esto responde mi primera pregunta, pero todavía estaría muy nervioso por la interacción a través de stdin/stdout. – Mike

3

Así es como Ruby puede usar un script de Python, interactuando con stdin y stdout del script.

foo.py lee dos enteros (cada uno en su propia línea) desde la entrada estándar, los agrega y escribe el resultado en la salida estándar. No sé Perl, por lo que ser amable conmigo:

#!/usr/bin/perl 

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

foo.rb ejecuta foo.py, dándole dos números para sumar, volviendo el resultado e imprimirla:

#!/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

perldoc perlipc estados:

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 es capaz de operar cada una de ellas.

0

Mencionó en uno de sus comentarios que desea ejecutar el código Perl dentro de Ruby. Esto no funcionará a menos que pueda hacer que el intérprete de Ruby comprenda la sintaxis de Perl. Can I get a BNF/yacc/RE for the Perl language? lo ayudará a comprender los desafíos que enfrentará.

+1

No necesita el intérprete de Ruby para entender Perl. Simplemente (¡solo!) Necesita insertar Perl en una extensión C para Ruby. :) –

5

exec de Uso Ruby()

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