• Publicidad

Ejecutar comando y recoger salida

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

Ejecutar comando y recoger salida

Notapor SacamantecaS » 2007-10-06 19:58 @874

hola

Soy un novato en Linux y estoy programando un pequeño script que coge los parámetros una tabla de MySQL y ejecuta un comando, lo que quiero hacer es ejecutar unos comandos con unos parámetros y saber si se han ejecutado correctamente y otros recoger la captura, tengo algo así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use strict;

use constant DIRECTORIO => '/home/manolo/ficheros'
use constant PROGRAMA   => '/home/manolo/leedat'

my $base_datos="estadisticas";
my $usuario="estadisticas";
my $clave="*****";
my $driver="mysql";

#Conectamos con la BD, si no podemos, ponemos un mensaje de error
my $dbh = DBI->connect("dbi:$driver:$base_datos",$usuario,$clave) || die "\nError al abrir la base datos: $DBI::errstr\n";

while (<>) {

        my $pendientes = $dbh->("SELECT id, concepto FROM ventas WHERE tipo ='nueva'");

        $pendientes->execute();

        while ( @pendiente=$pendientes->fetchrow_array())
        {
                my $capturaUrl = `PROGRAMA --display :0 DIRECTORIO/pendiente[0].dat`;
                if () { # Necesito saber si ha sido correcto o no. ! de true
                        my $hash = `md5sum DIRECTORIO/pendiente[0].dat`; # Cojo la primera columna ¿como lo hago?
                        my $pendiente = $dbh->("UPDATE ventas SET VALUES(etapa ='procesado',hash=$hash) WHERE id=$pendiente[0]");
                        $pendiente->finish();
                }
        }

        #Realizamos la etapa de liberaci�n de recursos ocupados por la sentencia
        $pendientes->finish();

}

#Nos desconectamos de la BD. Mostramos un mensaje si hay
#algun fallo
$dbh->disconnect || warn "\nFallo al desconectar.\nError: $DBI::errstr\n";
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4


Soy muy novato en esto de Perl y estoy intentando aprender, me falla este programa por muchos sitios. ¿Utilizaría popen? ¿Alguien puede ayudarme? Muchas gracias.

Todo esto lo hago en script de consola y muy bien, pero en consola no puedo ejecutar comprobaciones en la base de datos y por eso quiero usar Perl.

Saludos de manolo

P.D: La lista de distribución esta muy muerta.
SacamantecaS
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2006-11-09 03:06 @171

Publicidad

Notapor explorer » 2007-10-06 20:21 @890

¿Dónde están los prepare()?

Para saber si un programa se ha ejecutado correctamente, depende del propio programa. Si es un programa bien hecho, en un entorno Linux, devolverá un código de estado, siendo normalmente 0 para indicar todo bien, y distinto de cero para algo malo.

Para esto, lo mejor es usar system(), ya que además de ejecutar el programa, nos devolverá el código de salida (¡ojo! en el byte alto. Mira la página de system()).

Y para obtener la salida de md5sum, la primera columna, puedes hacerlo pasar por una expresión regular
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -le '($x) = qx(md5sum DIRECTORIO/pendiente[0].dat) =~ /^(\w+)/; print $x'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

o, más claro, con split
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
perl -le '($x) = split " ", qx(md5sum DIRECTORIO/pendiente[0].dat); print $x'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Qué lista de distribución está muerta?
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

Notapor SacamantecaS » 2007-10-07 08:38 @401

Hola.

Gracias por responder, estoy intentando hacer algo del tipo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use constant PROGRAMA   => '/home/manolo/leedat'
system("PROGRAMA parametros");

 
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero la constante no la resuelve, es que soy muy novato en Perl, pero no quiero utilizar PHP para esto, me gustaría que fuese Perl.

La lista de correo de PHP-ES.

Muchas gracias

saludos
SacamantecaS
Perlero nuevo
Perlero nuevo
 
Mensajes: 3
Registrado: 2006-11-09 03:06 @171

Notapor explorer » 2007-10-07 09:00 @417

Es que las constantes en Perl, no se interpolan, como si fuese una variable más...

La primera solución es esta:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use constant PROGRAMA   => '/home/manolo/leedat'

system(PROGRAMA . " parametros");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y la segunda solución, es la más profesional y la recomendada:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use Readonly;

Readonly my $PROGRAMA => '/home/manolo/leedat';

system("$PROGRAMA parametros");
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Usando el módulo Readonly, sí que podremos crear constantes que podremos interpolar.

En cuanto a la lista de PHP, es posible que la mayoría de la gente se haya movido al entorno web (foros y demás). O quizás es que la gente se está dando cuenta de lo horrible que es programar en ese lenguaje.
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

Notapor creating021 » 2007-10-07 10:19 @471

Además faltó una línea muy importante:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
use DBI;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Expect the worst, is it the least you can do?
Avatar de Usuario
creating021
Perlero frecuente
Perlero frecuente
 
Mensajes: 595
Registrado: 2006-02-23 16:17 @720
Ubicación: Frente al monitor


Volver a Básico

¿Quién está conectado?

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

cron