• Publicidad

Redireccionar salida de función print a una variable

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Redireccionar salida de función print a una variable

Notapor Germán » 2014-10-09 12:11 @549

¡Qué tal, amigos!

Soy nuevo en el foro, así como también en el lenguaje Perl. Hace un momento leí las reglas que se deben de seguir para redactar una pregunta en el foro, por lo tanto espero que mi primer mensaje las cumpla al 100 %.

Requiero ejecutar una consulta cíclica por segundo a una aplicación Java mediante un cliente JMX. Sé que existen diversas aplicaciones que realizan estas funciones de una manera fenomenal (como Nagios). Sin embargo, para poder utilizar esas herramientas es necesario instalar del lado del servidor del aplicativo Java ciertos complementos, de los cuales yo no tengo privilegios para poder hacerlo.

Investigando por Internet encontré un conector JMX que funciona desde una terminal (es un JAR), el cual se puede mantener una conexión abierta entre mi cliente que es ejecutado desde un script en Perl hacia el servidor. Y, en efecto, lo acabo de probar y la conexión se mantiene abierta y la información me la trae por segundo si utilizo una llamada a la función sleep().

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # This Perl script open connection and call domains
  2. # $jar stands for path of jmxterm jar file
  3.  
  4. open JMX, "| java -jar jmxterm-1.0-alpha-4-uber.jar -n -v silent";
  5. my $host = "10.119.131.14";
  6. my $port = 9030;                                    
  7. print JMX "open $host:$port\n";
  8. print JMX "bean IUM:Connector=DiameterAdapterServer0000\n";
  9.  
  10. while (1)
  11. {
  12.  
  13.   system('sleep 1');
  14.   print JMX "get TotalRequestsReceived\n";
  15.  
  16. }
  17.  
  18. close JMX;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Mi problema está en que el resultado de la línea 14 es impreso en pantalla por la función print. Sin embargo esta función se utiliza para poder ejecutar las opciones del cliente JAR JMX la cual vendría siendo la opción 'get'. Y lo que yo deseo es almacenar el resultado del print (línea 14) en una variable, para así posteriormente poder manipular esa variable y realizar diferencias de resultado de un segundo contra otro.

He estado investigando diversas formas de realizar esto, pero no he encontrado la manera correcta de cómo redirigir ese print de la línea 14 a una variable.

¿Me podrían apoyar con alguna sugerencia?

¡Saludos!
Germán
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2014-10-09 11:50 @535

Publicidad

Re: Redireccionar salida de función print a una variable

Notapor explorer » 2014-10-09 14:08 @631

Bienvenido a los foros de Perl en Español, Germán.

Perl solo hace lo que se le manda, y en un print(), solo hace eso: un print().

En la línea 14 se le manda a Perl enviar a la aplicación jmxterm una cadena de caracteres... y nada más.

Pero no es capaz de capturar esa salida (tal y como está hecho el programa ahora).

Como yo supongo que la salida de jmxterm es hacia la salida estándar (la pantalla), puedes usar las facilidades del shell para capturar la salida:

$ perl script.pl | tee salida.txt

Este comando ejecuta tu script Perl y envía una copia de la salida estándar hacia el archivo salida.txt. De esa manera vas viendo lo que va sacando, y queda guardada al mismo tiempo.

Otra opción sería hacerlo todo en Perl. Con el módulo IPC::Open2 se puede abrir un proceso hijo y poderle enviar comandos y recibir su salida. Hace poco hemos hablado de este asunto (ver final del mensaje). Eso sí: esto vale para cuando sabemos qué y cuánto tenemos que enviar, y qué y cuánto tenemos que recibir. Si no sabemos cuánto nos va a devolver, podría quedar bloqueado el programa.

Hay más módulos que hacen lo mismo, como en IPC::Open3, que es lo mismo, pero captura la salida estándar de error.

Un detalle más: el

system(sleep 1);

lo puedes sustituir por un sencillo

sleep 1;
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Redireccionar salida de función print a una variable

Notapor Germán » 2014-10-09 22:23 @974

explorer, agradezco tu pronta respuesta.

¿Crees que con IPC::Open2, pueda redirigir entonces la salida del print a una variable? Una alternativa como bien lo mencionas sería usar tee, y créeme que lo había contemplado, sin embargo como mi objetivo es manipular el resultado de ese print dentro del while y realizar operaciones de diferencia contra la siguiente iteración, por eso había descartado usar la redirección del sistema.

Voy a darle un vistazo a la información que me proporcionaste.

¡Nuevamente! Agradezco tu respuesta.

¡Saludos!
Última edición por explorer el 2014-10-09 22:36 @983, editado 1 vez en total
Razón: seria => sería; creeme => créeme; habia => había; iteracion => iteración; redireccion => redirección
Germán
Perlero nuevo
Perlero nuevo
 
Mensajes: 2
Registrado: 2014-10-09 11:50 @535

Re: Redireccionar salida de función print a una variable

Notapor explorer » 2014-10-09 23:20 @014

Sí, sí que podrás, porque con IPC::Open2 tienes acceso a lo que ejecuta el comando abierto con open().
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Google [Bot] y 0 invitados

cron