• 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-10-04 06:16 @303

Ademas creo que no me vale el 'if' este, ahora entra aki tanto para la cadena de ordenes como para la cadena de partes que esta en el programa en 'else'.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Publicidad

Notapor explorer » 2006-10-04 06:45 @323

Josmanue escribiste:Vale, ya lo he sacado del bucle while y ahora me devuelve esto:
#1UIDSP103FEC061003TIE103000@ODSP105@OTty0@ORGo Home@OP2
Fuente:1, UIDSP103FEC061003TIE103000@ODSP105@OTty0@ORGo Home@OP2
UID SP103
FEC 061003
TIE 103000
@OD SP105
@OT ty0
@OR Go Home
@OP 2
la cadena sql_or tiene: INSERT INTO ordenes SET origen_orden = 'SP103', hora = '10:30:00', dia = '061003';
Sigue sin pillar los campos que empiezan por '@' aunque los separa bien.
No da errores, pero si estos mensajes:
Possible attempt to separate words with commas at ./pfinal.pl line 87.
Name "main::OT" used only once: possible typo at ./pfinal.pl line 142.
Name "main::OP" used only once: possible typo at ./pfinal.pl line 142.


En efecto, hay un error. La línea correcta es esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   my %campos2_bd = (
   UID => 'origen_orden',       FEC => 'dia',           TIE => 'hora',      '@OD' => 'destino_orden',
   '@OT' => 'tipo_orden',   '@OD' => 'orden',     '@OP' => 'prioridad',
   );
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


A propósito. No está el campo '@OR'.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2006-10-04 06:50 @326

Josmanue escribiste:Ademas creo que no me vale el 'if' este, ahora entra aki tanto para la cadena de ordenes como para la cadena de partes que esta en el programa en 'else'.


Es cierto. La expresión regular vale para los dos casos...

Lo que se puede hacer es evitar que entre en el primer 'if' si se encuentra una '@' dentro de la $trama. Algo como esto:
Código: Seleccionar todo
    if ( ($fuente, $trama) = $linea =~ /(expresion regular)/ ) {
        if ( $trama =~ /\@/ ) {
            # Procesamos trama de órdenes
        }
        else {
            # Procesamos trama normal
        }
    }
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-10-05 06:07 @296

Perfecto, ahora ya me va todo, solo una cosita, ahora me sale esto:
Possible attempt to separate words with commas at ./pfinal.pl line 87.
Name "main::fuente" used only once: possible typo at ./pfinal.pl line 129.
Y no entiendo muy bien a que es debido, ¿se puede arreglar o elimino el 'use warnings' para que no me salga y punto?
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor Josmanue » 2006-10-05 07:10 @340

He empezado a probarlo y parece que funciona, pero da los siguientes warnings:
Possible attempt to separate words with commas at ./pfinal.pl line 87.
Name "main::fuente" used only once: possible typo at ./pfinal.pl line 129.
Use of uninitialized value in numeric eq (==) at ./pfinal.pl line 318, <> line 3.
Use of uninitialized value in numeric eq (==) at ./pfinal.pl line 318, <> line 5.
Use of uninitialized value in numeric eq (==) at ./pfinal.pl line 318, <> line 6.
Use of uninitialized value in numeric eq (==) at ./pfinal.pl line 318, <> line 7.
Use of uninitialized value in numeric eq (==) at ./pfinal.pl line 318, <> line 8.
Use of uninitialized value in numeric eq (==) at ./pfinal.pl line 318, <> line 10.
Use of uninitialized value in numeric eq (==) at ./pfinal.pl line 318, <> line 11.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-10-05 07:48 @367

Cuidado. El segundo aviso quiere decir que la variable $fuente, en la línea 129, no se utiliza más en el resto del programa. Podría ser un error.
En cuanto a los demás, en la línea 318 se está haciendo una comparación '==' con una variable que no ha sido inicializada (no ha recibido ningún valor), por lo que podría indicar otro error en el programa.
Última edición por explorer el 2006-10-06 06:14 @301, editado 1 vez en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-10-06 01:49 @117

A ver, el primer aviso, el de la linea 129 es en el bucle 'if' que trata las tramas de ordenes y de partes:

Código: Seleccionar todo
if(($fuente, $trama)=$linea =~/(?:#(1|2)((?:$campos2)+))/)
Y lo utilizo al principio del bucle 'else' (tratamiento de partes)......¿o no?
Código: Seleccionar todo
else
   {
       #Con esto sacamos el valor del campo "#" y lo almacenamos en $fuente
       #lo hago separado de los demas porque es el único campo que no empieza
       #con tres caracteres.
       next unless my($fuente, $trama)=$linea =~/(?:#(1|2)(($campos)+))/;
       $trama{FUE} = $fuente;
       ##print "Fuente:$fuente\n";

       ## Bucle en el que recorremos los campos para identificarlos #######################
       while ( $trama =~/($campos)/g )

En cuanto al segundo aviso, se produce al seleccionar dónde insertamos en database1 o database2 según el servicio y la variable '$dato' la saca de la busqueda de servicios que está algo más arriba, de hecho con el print compruebo que en '$dato' se encuentra el dato correcto, (normalmente un 3)
Código: Seleccionar todo
## Busqueda de los servicios: ########################################################

       my $sth = $dbh1->prepare("SELECT servicio FROM unidades WHERE unidad = '$trama{UID}'")
          or die $dbh1->errstr;
       $sth->execute()  or die $sth->errstr;
       my $dato = $sth->fetchrow_array();
   
       ##print "En sth hay: $sth\n";
       print "El servicio correspondiente es: $dato\n";

       ##Seleccionamos e insertamos en la Base de Datos adecuada: ###########################

       if ($dato == 3)
       {
          my $filas = $dbh1->do($sql)
          or die $dbh1->errstr;
      print "\$INFOK*\r\n";   
       }
¿En teoría debería ser correcto ¿no?
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-10-06 06:26 @310

* En el 'if' es donde $fuente recibe su valor, pero el aviso que saca Perl dice que tu luego no haces uso de él.

* En el 'else', sobra la línea 'next'.

* El segundo aviso dice que $dato está indefinido, por lo que la comparación 'if ( $dato == 3 )' es 'sospechosa'. Eso quiere decir que en $dato no se ha guardado nada porque nada se ha encontrado en la base de datos que coincida con $trama{UID}. Prueba a cambiar el 'if' por 'if ( defined $dato and $dato == 3 )'
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-10-06 07:41 @362

Pues perl dirá lo que quiera, pero creo que si que lo uso, se lo asigno a $trama{FUE} y de echo cuando hago el insert en la tabla me lo inserta. Aunque de esto quería decirte que el 'if' que trata las tramas y las ordenes sigue sin irme bien, no me diferencia tramas de ordenes.
Si uso:
Código: Seleccionar todo
if(($fuente, $trama)=$linea =~/(?:#(1|2)((?:$campos2)+))/)
los campos de la trama de partes que no coinciden con los que hay en '$campos2' (la mayoría) no los inserta en la tabla, parece que sólo busca los que hay en '$campos2'. Mientras que si pongo:
Código: Seleccionar todo
if(($fuente, $trama)=$linea =~/(?:#(1|2)((?:$campos)+))/)
Cambiando '$campos2' por '$campos' entonces nunca entra en el 'if($trama=~/\@/)' y nunca hace la parte de 'partes'. He intentado:
Código: Seleccionar todo
if((($fuente, $trama)=$linea =~/(?:#(1|2)((?:$campos)+))/) ||(($fuente, $trama)=$linea =~/(?:#(1|2)((?:$campos2)+))/))

Es decir, hacer una OR pero no me funciona. ¿Por que?
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-10-06 09:33 @439

Disculpas, pero estos días no doy pie con bola y no hago más que cometer errores, y las soluciones que te he dado no son precísamente buenas ni correctas.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14476
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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