• Publicidad

Cómo ejecutar funciones perl .pl desde una shell unix

¿Eres administrador de sistemas? Este foro es para todos aquellos temas relacionados con el uso de Perl para administración de sistemas.

Cómo ejecutar funciones perl .pl desde una shell unix

Notapor Angelmoise » 2012-09-26 12:04 @544

Hola, estimados:

Saludos respetuosos a todos, he aquí nuevamente como programador, después de ver gestión de proyectos, me toca programar nuevamente después de 10 años alejado pero ahora en Unix antes era VB, VF y algunas shells batch en DOS.

Mi consulta es la siguiente y quiero ver si me pueden ayudar, por favor.

En la empresa alguien programó unos procesos Unix y solo dejó los binarios. Ahora estamos migrando a Red Hat y necesitamos crear librerías nuevas de esos procesos.

Averiguando en la web con Perl, me pareció bastante interesante pues ahora quiero programar las funciones de los procesos binarios en Perl "Open source". La única restricción es que la dirección me solicita por tema de conocimiento hacer las llamadas desde un .ksh a .pl pasando los parámetros necesarios para ejecutar las funciones o procedimientos programados en el archivo Perl.

En el fondo, necesito orientación de:
¿Cómo ejecutar funciones Perl .pl pasando parámetros desde un shell Unix y leer el retorno de la función en el shell?

Ejemplo:

Estoy generando un archivo de funciones:

General_Function_Perl.pl, que contiene el siguiente código (no probado):
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub SeparaCampoString {
  2.     my $VarString       =    shift;
  3.     my $CharSparator    =    shift;
  4.     my $InitialPosition =    shift;
  5.     my $NewVar          = substr($VarString, $InitialPosition, index($VarString,$CharSparator));
  6.  
  7.     return $NewVar;
  8. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


y la llamada la quiero hacer desde un Shell Unix.

En esta línea:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. ############### Cargo arreglo de configuración de códigos
  2. ############### de servicio con los archivos generados
  3. for t in "${filecontent00[@]}" 
  4. do
  5.     # buscamos los archivos generados y comparo
  6.     echo "El valor del arreglo es: " "$t"
  7.     line=${filecontent00[*]}
  8.  
  9.     ############## Aquí debemos llamar a funciones Perl para descomponer la cadena
  10.     ############## de la variable arreglo con el valor de la variable <span style="font-weight: bold">line</span>,
  11.     ############## para que me retorno solo los datos requeridos en función de los
  12.     ############## parámetros de entrada de la función Perl SeparaCampoString
  13.  
  14.     # Intenté con <span style="font-weight: bold">awk</span>, pero como no soy especialista en esto y necesitamos
  15.     # hacerlo rápido no me funcionó procesar la variable en el awk y no quiero
  16.     # leer archivos si no más bien manejar los datos en memoria.
  17.  
  18.     #awk -F ';' '{print $1}' "$hola" > kk.dat # no funciona awk sobre variables
  19.                                               # debo dejar el dato procesado en un archivo
  20.                                               # y ahí lo aplico
  21. done
  22.  
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Agradecería mucho cualquier información que me pueda guiar el respecto. No sé cómo hacer la sentencia en el shell para llamar al archivo .pl y su función más el envío del parámetro y el código de retorno parámetro.


Muchas gracias a toda la comunidad.

atte.

el novato
Angelmoise
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-26 11:45 @531

Publicidad

Re: Cómo ejecutar funciones perl .pl desde una shell unix

Notapor explorer » 2012-09-26 14:54 @662

Bienvenido a los foros de Perl en Español, Angelmoise.

No se pueden llamar a las funciones Perl, de esta manera (bueno, se puede, pero es algo más complejo).

Las funciones o subrutinas deberían pertenecer a un programa completo.

Así, tu función se reescribiría como programa así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my $VarString       = shift;
  3. my $CharSparator    = shift;
  4. my $InitialPosition = shift;
  5.  
  6. my $NewVar          = substr($VarString, $InitialPosition, index($VarString,$CharSparator));
  7.  
  8. print $NewVar;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Los parámetros los pasas en la línea de comandos:
perl programa.pl par1 par2 par3

y el resultado sale en pantalla (a causa del último print()).

En bash shell se llamaría así:
resultado=$(perl programa.pl $1 $2 $3)

porque $() hace una llamada y recoge la salida producida.

De todas maneras, esta función que tenemos de ejemplos lo único que hace es extraer una subcadena de una cadena mayor. No conozco el Korn Shell (ksh), pero en el Bash Shell sí que hay operaciones de cadenas de caracteres, por lo que podrías realizar todas las operaciones con solo el shell.

O, de otra manera: Perl es lo suficientemente potente como para resolver todo el problema, por sí mismo, sin tener que mezclar lenguajes. Si nos das más detalles de un ejemplo sencillo, te podemos pasarlo a Perl, y así solo tendrás un programa que ejecutar.

Sí que es posible pasar variables del shell al awk, pero es cuestión de jugar con las comillas ;)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Cómo ejecutar funciones perl .pl desde una shell unix

Notapor Angelmoise » 2012-09-26 15:35 @691

AAAAAhhh, te pasaste. Muchas gracias por atender mi consulta. Pensé que no me tomarían en cuenta. Igual me dejas mucho más claro.

Estoy pensando trasladar la shell completa a Perl, luego manipular los archivos desde ahí.

Ahora me surge una consulta más: tengo que procesar 150 000 archivos diarios, con toneladas de registros y campos y debo minimizar los tiempos de procesamiento. ¿Qué tan potente sería Perl para estas operaciones? ¿Y qué tan complejo sería hacer que la función retorne los datos al shell? ¿El .pl puede enviar un código de retorno asignando el valor de lo procesado a $?? Esto bajo el contexto de ampliar más el tema a la solución que me planteas y así evitar escribir distintos programas .pl para poder ejecutar las funciones que deseamos programar.

Con respeto a las funciones de manipulación de cadenas desde Korn SHell todas las que he revisado apuntan a manipular ficheros haciendo lecturas de disco, lo que me obliga a redirigir las salidas a ficheros temporales para leer nuevamente y con la cantidad de archivos que tengo que procesar podría tener problemas de prestaciones y es lo que me preocupa la idea es dejar optimizado el servidor de procesos con fuente abierta y perfectamente tuneadas disponiendo de librerías específicas para procesar la información...


Con respecto al ejemplo más bien te doy la problemática. Sería la siguiente:
  1. Necesitamos controlar la llegada automática de varios archivos en distintas rutas o directorios
  2. Cada uno de los archivos tiene un prefijo distinto + yyyymmdd.hhmm
  3. Puedo tener más de un archivo con un mismo prefijo + yyyymmdd
  4. Sabemos cuántos archivos deben llegar dado que tenemos uno de los parámetros que registra el nombre, la cantidad y la ruta donde se ubican
  5. Debemos evaluar la cantidad de archivos por día
  6. Generar un reporte con los que faltan y su secuencia
  7. Enviar un correo al usuario
  8. Manejar óptimamente temas de prestaciones para evitar demoras en el procesamiento. Llegan 150 000 aproximadamente, cada día, de 1 Mb hasta 20 Mb
  9. Agendar el proceso en el crontab

Eso es.

Mi idea es:
  1. Levantar un arreglo con los parámetros nombre del archivo, cantidad y ruta "Hecho"
  2. Leer los campos por separadores ";" y tomar el campo (para eso la función Perl)
  3. Armar string con el nombre del archivo prefijo+fecha
  4. Listar el directorio y buscar la cantidad de archivos para ese prefijo
  5. Contarlos y determinar la secuencia
  6. Buscar el contenido del arreglo en la lista obtenida con ls -a patrón
  7. Generar informe de salida con los archivos y su secuencia que no existen
  8. Seguir con el siguiente archivo en otra ruta y repetir el procedimiento hasta que se acabe el contenido del arreglo
  9. Mandar el correo al usuario informando de que no llegaron todos los archivos


Eso es.


Saludos y gracias.
Angelmoise
Perlero nuevo
Perlero nuevo
 
Mensajes: 6
Registrado: 2012-09-26 11:45 @531

Re: Cómo ejecutar funciones perl .pl desde una shell unix

Notapor explorer » 2012-09-26 19:31 @855

Angelmoise escribiste:tengo que procesar 150 000 archivos diarios, con toneladas de registros y campos y debo minimizar los tiempos de procesamiento. ¿Qué tan potente sería Perl para estas operaciones?
Cuestión de tomar la calculadora: multiplicar los 150 000 archivos, multiplicados por su longitud, divididos por la frecuencia de reloj del procesador...

Sí, yo creo que sí es abordable.

Angelmoise escribiste:¿Y qué tan complejo sería hacer que la función retorne los datos al shell?
Hay dos maneras básicas: con un print() devuelves una salida tipo texto, y con exit() devuelves un valor a la variable de entorno $?.

Angelmoise escribiste:Con respeto a las funciones de manipulación de cadenas desde Korn SHell todas las que he revisado apuntan a manipular ficheros haciendo lecturas de disco,
Es normal: el Korn Shell tiene una serie de años, por lo que todos los Linux modernos traen por defecto el Bash Shell, que es mucho más potente.

Por ejemplo, para hacer la extracción de una subcadena, se escribe así:

${parámetro:inicio:longitud}


Angelmoise escribiste:Con respecto al ejemplo más bien te doy la problemática. Sería la siguiente:
  1. Necesitamos controlar la llegada automática de varios archivos en distintas rutas o directorios
  2. Cada uno de los archivos tiene un prefijo distinto + yyyymmdd.hhmm
  3. Puedo tener más de un archivo con un mismo prefijo + yyyymmdd
  4. Sabemos cuántos archivos deben llegar dado que tenemos uno de los parámetros que registra el nombre, la cantidad y la ruta donde se ubican
  5. Debemos evaluar la cantidad de archivos por día
  6. Generar un reporte con los que faltan y su secuencia
  7. Enviar un correo al usuario
  8. Manejar óptimamente temas de prestaciones para evitar demoras en el procesamiento. Llegan 150 000 aproximadamente, cada día, de 1 Mb hasta 20 Mb
  9. Agendar el proceso en el crontab
Hay algunos puntos oscuros, como por ejemplo, definir lo que significa "controlar", pero todo lo demás es fácil de hacer por Perl. Mediante las funciones opendir(), readdir() y closedir() se pueden leer los contenidos de los directorios. No sabemos la estructura de los directorios, pero si es simple (sin muchas profundidades), se puede resolver de esta manera. Si no es así, hay otros módulos que pueden ayudar. Y para enviar el correo, pues también se puede (por estos foros hay algunos ejemplos).

Angelmoise escribiste:Mi idea es:
  1. Levantar un arreglo con los parámetros nombre del archivo, cantidad y ruta "Hecho"
  2. Leer los campos por separadores ";" y tomar el campo (para eso la función Perl)
  3. Armar string con el nombre del archivo prefijo+fecha
  4. Listar el directorio y buscar la cantidad de archivos para ese prefijo
  5. Contarlos y determinar la secuencia
  6. Buscar el contenido del arreglo en la lista obtenida con ls -a patrón
  7. Generar informe de salida con los archivos y su secuencia que no existen
  8. Seguir con el siguiente archivo en otra ruta y repetir el procedimiento hasta que se acabe el contenido del arreglo
  9. Mandar el correo al usuario informando de que no llegaron todos los archivos
Si se trata de un archivo con campos separados con ";" se puede usar split() para extraer la información.

Todo lo que veo son cosas administrativas, de las que yo he hecho muchas. Y con Perl se resuelven muy bien.

Muevo el hilo al foro de Administración :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Administración

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado