• Publicidad

Brindar argumentos en bandeja a otro script

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

Brindar argumentos en bandeja a otro script

Notapor reLlene » 2013-08-20 13:36 @608

Buenas, compañeros. :D Abro este hilo con motivo de consulta.

Resulta que cuento con un script que procesa unos productos y en base a ellos devuelve unas estadísticas (numeritos) finales. Numeritos los cuales deseo tomar desde otro script para simplemente embeberlo en unas tablas y sean más lindos a la vista que por terminal :shock: , puesto que no son para mi sino para otros colegas.

¿Cómo puedo jugar con esto? Bien podría hacerlo desde el mismo script con el que proceso los productos y al final escribir ese html en un binario pero... resulta que el requerimiento que se me hizo es ese, el de "levantar" dichos números desde otro programa y generar ese contenido html. No sé si me explico. :shock:


¡¡Agradezco cualquier cable, desde ya!! ¡¡un saludo, compass!! :)
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Publicidad

Re: Brindar argumentos en bandeja a otro script

Notapor explorer » 2013-08-20 13:50 @618

Puedes hacer que el primer programa entregue los números en su salida estándar, y luego en tu programa, recibirlos en la entrada estándar. Solo queda ejecutarlos entubados:

programa1 | programa2.pl

Si son pocos argumentos, puedes hacer que el primer programa mande ejecutar el segundo programa, mandándole los argumentos en su línea de argumentos:

# dentro del programa 1:
system( programa2.pl arg1 arg2 arg3 );


Si es mucha información, pues la solución clásica es la de guardarla en archivos:

programa1 > estadisticas.txt
programa2.pl < estadisticas.txt


Si se acuerda por adelantado el nombre del archivo con los resultados, se puede simplemente ejecutarlos en orden:

programa1
programa2.pl


En fin... hay muchas posibilidades. Perl es conocido en este campo como creador de programas "filtro", que se aplican con tuberías, igual a la primera solución indicada.
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: Brindar argumentos en bandeja a otro script

Notapor reLlene » 2013-08-22 11:32 @522

¡¡¡Fantástico!!! :D

Me decliné, finalmente, por el de hacer uso de la función system() y me funciona bien excepto cuando uno de esos argumentos es un hash.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # en el programa 1
  2. my $arg1= 234;
  3. my $arg2= 43;
  4. system("perl /rutaDondeTengoElPrograma2/programa2.pl $arg1 $arg2 %hash"); # use comillas dobles porque con las simple se bloquean las variables
  5.  
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # en mi programa 2
  2. my ($var1,$var2,%hash) = @ARGV;
  3. print "$var1, $var2,%hash \n";
  4.  
  5. # mi __output__
  6. # 1, 2, %hash
  7. # inclusive si en programa 1 paso al hash como \%hash
  8.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿¿alguna sugerencia?? :?
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Re: Brindar argumentos en bandeja a otro script

Notapor explorer » 2013-08-22 12:14 @551

Perl no hace una interpolación de los hash, si están entrecomillados:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -E '%h = ( a => 1, b => 2, c => 3 ) ; say "%h"'
  2. %h
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

En cambio, si lo mandamos de forma directa, sí que salen los valores del hash:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. $ perl -E '%h = ( a => 1, b => 2, c => 3 ) ; say %h'
  2. c3a1b2
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Así que esa la forma que debes usar para comprobar si recibes bien el hash:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. print "$var1, $var2, ", %hash, "\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Otra forma, quizás un poco enrevesada, pero que se utiliza mucho por los expertos, es la de forzar la interpolación dentro de las comillas dobles. Eso se consigue si transformamos la expresión en algo que se parezca a un array o lista de elementos.

Esta es una de esas cosas medio escondidas que tiene Perl. Bueno, en realidad, no está escondida: perldoc -f scalar:
scalar EXPR
Fuerza EXPR a ser interpretada en contexto escalar y devuelve el valor de EXPR.

@contadores = ( scalar @a, scalar @b, scalar @c );

No hay un operador equivalente que fuerce a una expresión a ser interpolada en contexto de lista, ya que en la práctica, esto nunca es necesario. Sin embargo, si realmente
quiere hacer eso, puede usar la construcción "@{[ (una expresión) ]}", pero por lo general un simple "(una expresión)" basta.

...

Así que eso es lo que hacemos:
Sintáxis: [ Descargar ] [ Ocultar ]
Using bash Syntax Highlighting
  1. > perl -E '%h = ( a => 1, b => 2, c => 3 ) ; say "@{[ %h ]}"'
  2. c 3 a 1 b 2
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y ya sale bonito (a costa de poner en una sentencia un montón de caracteres especiales ;) )

Una posible versión (comprobada):
Sintáxis: (programa1.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. my %hash = ( a => 1, b => 2, c => 3 );
  3. my $arg1 = 234;
  4. my $arg2 = 43;
  5.  
  6. system('/usr/bin/perl', 'programa2.pl', $arg1, $arg2, %hash);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. my ($var1, $var2, %hash) = @ARGV;
  3. print "$var1, $var2, @{[ %hash ]}\n";
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> perl programa1.pl
234, 43, c 3 a 1 b 2
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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: Brindar argumentos en bandeja a otro script

Notapor reLlene » 2013-08-22 14:30 @646

Gracias nuevamente por la ayuda que me das, explorer, pero solo veo la cabeza del hash a la hora de imprimirlo.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. $hash{48}{38.76}=45.37;
  2. $hash{48}{40.5}=45.37;
  3. $hash{52}{11.49}=13.97;
  4. $hash{52}{14.05}=16.45;
  5.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
52HASH(0x8d7fca8)48HASH(0x8d65968)
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


El problema parece estar en que se trata de un HoH :?

Lo que consigo es mostrar todo el contenido mediante el uso de Data::Dumper:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $dump = Dumper \%hash
  2.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


consiguiendo la siguiente salida
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
$VAR1 = {
          '52' => {
                    '11.49' => '13.97',
                    '14.05' => '16.45'
                  },
          '48' => {
                    '40.5' => '45.37',
                    '38.76' => '45.37'
                  }
        };
 
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4


pero ya pierdo el control de cada una de las keys internas :(
Sexo : unzip ; strip ; touch ; grep ; finger ;mount ; fsck ; more ; yes ; umount ; sleep.
Avatar de Usuario
reLlene
Perlero nuevo
Perlero nuevo
 
Mensajes: 97
Registrado: 2012-06-04 07:16 @344

Re: Brindar argumentos en bandeja a otro script

Notapor explorer » 2013-08-22 15:54 @704

Si la estructura que quieres intercambiar es compleja, pues entonces ya no se trata de una respuesta sencilla... Se trata de un problema de serialización de datos.

Aquí te voy a dar una solución, que se puede conseguir con cualquier distribución de Perl, sin instalar más módulos, a condición de que los programas tengan acceso a un sistema de archivos donde puedan escribir y leer un archivo.
Sintáxis: (programa1.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use Storable;
  3.  
  4. my %hash = (
  5.     48 => {
  6.         38.76 => 45.37,
  7.         40.50 => 45.37,
  8.     },
  9.     52 => {
  10.         11.49 => 13.97,
  11.         14.05 => 16.45,
  12.     },
  13. );
  14.  
  15. my $arg1 = 234;
  16. my $arg2 = 43;
  17.  
  18. store \%hash, 'myhash';           # "almacenamos" el hash a disco, en ese archivo
  19.  
  20. system('/usr/bin/perl', 'programa2.pl', $arg1, $arg2);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: (programa2.pl) [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use Data::Dumper;
  3. use Storable;
  4.  
  5. my ($var1, $var2) = @ARGV;
  6.  
  7. my %hash = %{ retrieve('myhash') };     # "recuperamos" el hash almacenado antes
  8.  
  9. print "$var1, $var2\n";
  10.  
  11. print Data::Dumper->Dump([ \%hash ], [ '*hash' ]);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
> perl programa1.pl
234, 43
%hash = (
          '52' => {
                    '11.49' => '13.97',
                    '14.05' => '16.45'
                  },
          '48' => {
                    '40.5' => '45.37',
                    '38.76' => '45.37'
                  }
        );
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4

Se puede hacer de muchas otras maneras. Los jóvenes ahora usan XML o JSON. Se podría crear, por ejemplo, una estructura JSON basada en el hash y pasarlo como un argumento más al programa.
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 Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 3 invitados

cron