• Publicidad

Recorrido de cadenas y separación de campos

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

Notapor Josmanue » 2006-09-20 04:02 @210

Muchisimas gracias, :D no se me hubiera ocurrido, yo estaba probando con la funcion 'localtima(time)' y no paraba de darle vueltas :shock: , estoy probando ahora lo del IO::Select. Ya contaré que tal me ha ido.
Gracias.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Publicidad

Notapor Josmanue » 2006-09-22 02:41 @154

Hola, no se si debería abrir otro hilo en la parte de Bases de Datos, pero como es una duda de este programa en principio la pongo aqui.
A ver, el problema es que debo buscar en una tabla "ordenes" si existe alguna orden para el vehiculo que esta conectado en ese momento, y si es asi, enviarle dicha orden. Pero si no existe ninguna orden para ese vehiculo ¿Que me devuelve el mySql? ¿Devuelve un 'NULL'? estaba pensando en algo así:
Código: Seleccionar todo
my $sth2 = $dbh1->prepare("SELECT orden FROM ordenes WHERE destino_orden='$trama{UID}'")
       or die $dbh1->errstr;
$sth2->execute()   or die $sth2->errstr;
my $orden = $sth2->fetchrow_array();
if($orden!='NULL')
    print "$orden";

Que os parece? ¿Se puede mejorar? (supongo que si)
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-09-22 06:52 @328

Prueba... si sale algún error nos lo dices...

¿De dónde has sacado que las funciones del DBI devuelven el string 'NULL'?
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

Notapor Josmanue » 2006-09-25 05:07 @255

Tienes toda la razón no sale, y no se como ponerlo, por favor que alguien me ayude!! he probado también con:
Código: Seleccionar todo
my $sth2=$dbh->prepare("IF EXISTS(SELECT orden FROM ordenes WHERE destino_orden='$trama{UID}')
             SELECT orden FROM ordenes WHERE destino_orden='$trama{UID}'")
    or die $dbh->errstr;
sth2->execute() or die $sth2->errstr;
my $orden= $sth2->fetchrow_array();
print "$orden";
Pero tampoco, no devuelve nada a pesar de que introduzco una UID que está en la tabla. En realidad la sentencia no es exactamente asi, esto es una prueba, la sentencia debe realmente buscar en la tabla "ordenes" si existe alguna orden con el campo "destino_orden = $trama{UID}" y que el campo ack_orden=0, si es así, enviarla, 'print', esperar a que responda el camion con 'cadenaok' (responde antes de 15 segundos) y entonces actualizar con UPDATE ack_orden=1. ¿Me podrías echar una mano con esto?

Por otra parte, la solucion que me diste explorer no me funciona, ya al arrancar el telnet me dice:
"my" variable $trama masks earlier declaration in same scope
y al introducir la cadena me cierra la conexion y me sale
Unmatched ( in regex; marked by <-- HERE in m/(HERE (?:#(0|2)(UID.{5}|FEC.{6}|VAL.|......sigue la lista de campos...|PTO.)+)/

Sabes de que puede ser o te quedas con la misma cara que yo?? :shock: :shock:
Si te sirve de ayuda vuelvo a poner el programa tal y como esta ahora.
Gracias.
Última edición por Josmanue el 2006-10-03 04:18 @221, editado 1 vez en total
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-09-25 06:21 @306

'my $trama' lo tienes puesto dos veces y por eso Perl te avisa. La línea que pone
Código: Seleccionar todo
my ($fuente, $trama) = $trama =~ /(?:#(0|2)($campos)+)/;
debes cambiarla por
Código: Seleccionar todo
my $fuente;
($fuente, $trama) = $trama =~ /(?:#(0|2)($campos)+)/;


Por lo que respecta al SQL, yo nunca he usado lo del IF EXISTS, por lo ahí no puedo ayudarte. Yo haría un SELECT normal, con la opción WHERE. La documentación de EXISTS está en http://dev.mysql.com/doc/refman/4.1/pt/ ... eries.html . Creo que el IF sobra.

Sintáxis: [ Descargar ] [ Ocultar ]
Using sql Syntax Highlighting
SELECT orden FROM ordenes WHERE destino_orden='$trama{UID}' AND ack_orden='0';
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

enviarla, 'print', esperar a que responda el camion con 'cadenaok' (responde antes de 15 segundos) y entonces actualizar con UPDATE ack_orden=1.
Esto puede ser algo complicado... pues estamos ya hablando de sincronización entre equipos. ¿Qué ocurre si pasan 15 segundos y no hay respuesta? ¿Qué pasa si en esos 15 segundos seguimos recibiendo tramas del/de otros camiones?

Si lo estás haciendo con programas distintos entonces es otro problema distinto...
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

Notapor Josmanue » 2006-09-25 06:46 @323

Gracias por responderme tan rápido, me estas ayudando un monton.
Lo de la trama ya me imaginaba que era algo así, pero no era capaz de verlo, ya estoy algo mareado de darle vueltas al mismo código. Graicas.
Lo he cambiado y ya no me da ese fallo, pero me sigue cerrando la conexion y me sigue diciendo lo del Unmatched (in regex......) segun esto en la linea 102.

En cuanto a tu pregunta, si pasan 15 segundos y no hay respuesta, entiendo que no la ha recibido y le vuelvo a enviar la orden, y sólo recibirá cadenas del vehículo que abra la conexión, si otro vehiculo abre la conexion lo hará con otra instancia de este programa.
Gracias.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-09-25 07:15 @343

El problema está en las expresiones regulares, naturalmente.

La primera donde dice
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next unless $trama =~/((?:#(0|2)($campos)+)/;
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
debe ser
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next unless $trama =~/#(0|2)($campos)+/;
Coloreado en 0.001 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

Notapor Josmanue » 2006-09-26 02:34 @148

Muchas gracias ese era el fallo, odio las expresiones regulares eh! me traen loco!
En cuanto a la sentencia SQL, mi primera idea fue la opción que me das pero ¿Que ocurre si no existe ninguna orden para esa unidad? ¿que me devuelve el SELECT? porque si no hay orden alguna, entonces no tengo que mandar (print) nada.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-09-26 04:01 @209

Si SELECT no devuelve nada, entonces el número de filas (rows) devueltas es 0, y de esa manera sabes que no debes mandar nada (hacer un if() y comprobarlo).

Lo dice el manual:

fetchrow_array

Código: Seleccionar todo
     @ary = $sth->fetchrow_array;


An alternative to fetchrow_arrayref. Fetches the next row of data and returns it as a list containing the field values. Null fields are returned as undef values in the list.

If there are no more rows or if an error occurs, then fetchrow_array returns an empty list. You should check $sth->err afterwards (or use the RaiseError attribute) to discover if the empty list returned was due to an error.

If called in a scalar context for a statement handle that has more than one column, it is undefined whether the driver will return the value of the first column or the last. So don't do that. Also, in a scalar context, an undef is returned if there are no more rows or if an error occurred. That undef can't be distinguished from an undef returned because the first field value was NULL. For these reasons you should exercise some caution if you use fetchrow_array in a scalar context.

Que quiere decir:
fetchrow_array

Código: Seleccionar todo
     @ary = $sth->fetchrow_array;


Una alternativa a fetchrow_arrayref. Recupera la siguiente fila de datos y los devuelve como una lista conteniendo los valores de los campos. Los campos nulos son devueltos como undef en la lista.

Si no hay más filas o si ocurre un error, entonces fetchrow_array devuelve una lista vacía. Debes comprobar después con $sth->err (o con el atributo RaiseError) si la lista vacía fue debida a un error.

Si es llamado en contexto escalar para una sentencia que tenga más de una columna, no está definido lo que el driver devolverá, si el valor de la primera o de la última columna. Así que no lo haga. También, en contexto escalar, se devuelve un undef si no hay más filas o si ocurre un error. Este undef no puede distinguirse del caso de que el primer campo sea NULL. Por estas razones debe tener alguna precaución si usa fetchrow_array en contexto escalar.

Date cuenta de que además te recuerda que estás usando fetchrow_array en contexto escalar:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $orden = $sth2->fetchrow_array();
if($orden!='NULL') {
    print "$orden";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y eso es más difícil de tratar que haciendolo en contexto lista:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @orden = $sth2->fetchrow_array();
if( @orden ) {
    print "@orden";
}
Coloreado en 0.001 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

Notapor Josmanue » 2006-09-27 05:10 @257

Esto es el cuento de nunca acabar. Sabrías decirme por qué ahora no me devuelve el servicio cuando antes si lo hacía?? No me devuelve nada y por tanto nunca entra en el 'if' y nunca inserta nada :cry: :cry:
Por favor necesito terminar esto ya, ayudaaaaa.
El programa está como más arriba, solo he añadido al final, despues del 'print "\$INFOK*\r\n";'
Código: Seleccionar todo
my $sth2=$dbh1->prepare("SELECT orden FROM ordenes WHERE destino_orden='trama{UID}' AND ack_orden = '0'")
       or die $dbh1->errstr;
$sth2->execute()     or die $sth2->errstr;
my @orden = $sth2->fetchrow_array();
if (@orden)
       print " @orden ";

Aunque no creo que influya ya que lo he probado sin añadirle nada y tampoco me devuelve el servicio, yo creo que puede ser algo del bucle o del IO::Select.
Gracias.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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