• 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-10 07:08 @339

Claro es que acabo de darme cuenta de que no saco el 'uid' bien en los dos primeros if. Como puedo sacarlos teniendo en cuenta que en estas cadenas no viene precedido por las letras 'UID'
Código: Seleccionar todo
my $linea = <>; #con esto leemos la cadena por la entrada estándar
    chomp $linea;   #y le quitamos el final de línea.
    my $primero = substr($linea, 0, 1);
    ##print "$linea\n";
   
    if ($primero eq '$')
    {
   ##print "Entro en el bucle 1";
   my $sth2=$dbh1->prepare("SELECT orden FROM ordenes_3 WHERE destino_orden='$uid' AND ack_orden='0'")
       or die $dbh1->errstr;
   $sth2->execute()        or die $sth2->errstr;
   my @orden=$sth2->fetchrow_array();
   if(@orden)
   {
       print "@orden";
   }
   
    }
    elsif ($primero eq '@')
    {
   ##print "entro en el bucle 2";
   $sql2 = ("UPDATE ordenes_3 SET ack_orden='1' WHERE destino_orden='$uid';");
   my $fila = $dbh1->do($sql2)
       or die $dbh1->errstr;
    }

Si no que en el primer caso, va destras de '$' (el estoy vivo '$SP103' por ejemplo y en el segundo va en la cadena '@OCSP103' por ejemplo. En ambos casos he puesto "destino_orden='$uid'" pero este '$uid' hay que sacarlo antes ¿no?
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Publicidad

Notapor explorer » 2006-10-10 07:23 @349

Claro... está dentro de $linea. Debes sacarlo con una expresión regular, o con un substr, que puede ser más fácil.
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-10-10 07:33 @356

Ok pero no entiendo muy bien lo que me has dicho antes para sacar los campos de la tabla ordenes,
Código: Seleccionar todo
my $orden = '$';
        $orden .= '@OC' . "'$orden[6]'";
        $orden .= 'UID' . "'$orden[4]'";
        $orden .= 'FEC' . "'$orden[2]'";
        $orden .= 'TIE' . "'$orden[3]'";
        $orden .= '@OD' . "'$orden[5]'";
        $orden .= '@OT' . "'$orden[6]'";
        $orden .= '@OR' . "'$orden[7]'";
        $orden .= '@OP' . "'$orden[8]'";
        print "$orden\n";
¿Que indica lo que va entre corchetes? ¿el tamaño? lo digo porque el campo '@OR' su tamaño es variable.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor Josmanue » 2006-10-10 07:59 @374

De hecho, ahora me devuelve esto:
Possible attempt to separate words with commas at ./pfinal.pl line 87.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 119, <> line 2.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 120, <> line 2.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 121, <> line 2.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 122, <> line 2.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 123, <> line 2.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 124, <> line 2.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 125, <> line 2.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 126, <> line 2.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 119, <> line 3.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 120, <> line 3.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 121, <> line 3.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 122, <> line 3.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 123, <> line 3.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 124, <> line 3.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 125, <> line 3.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 126, <> line 3.
Que creo que son las lineas que acabamos de meter. Ya he hecho el 'substr' para sacar el '$uid'
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-10-10 10:21 @473

Josmanue escribiste:Ok pero no entiendo muy bien lo que me has dicho antes para sacar los campos de la tabla ordenes,
Código: Seleccionar todo
$orden .= '@OC' . "'$orden[6]'";
¿Que indica lo que va entre corchetes? ¿el tamaño? lo digo porque el campo '@OR' su tamaño es variable.

$orden[6] es el séptimo valor del array @orden.
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 explorer » 2006-10-10 10:33 @481

Josmanue escribiste:De hecho, ahora me devuelve esto:
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 119, <> line 2.
Que creo que son las lineas que acabamos de meter.
Eso quiere decir que el SELECT ha devuelto campos vacíos.
Inserta la línea
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
next unless $orden[0];
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
antes de crear la variable $orden, para que salte a la siguiente @orden en caso de que id_orden tenga un valor vacío.
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-10-11 02:22 @140

Pues no construye la cadena bien. Lo he probado de las dos formas que me has dicho y en ambas la cadena que imprime es:
@OC' 'UID' 'FEC''TIE' '@OD''@OR''@OR' '@OP''
Es decir, entre nombre de campo y nombre de campo un par de comillas simples y no el contenido del campo. Y me sigue devolviendo los mismos avisos de:
Possible attempt to separate words with commas at ./pfinal.pl line 87.
Use of uninitialized value in string at ./pfinal.pl line 120, <> line 1.
Use of uninitialized value in string at ./pfinal.pl line 121, <> line 1.
Use of uninitialized value in string at ./pfinal.pl line 122, <> line 1.
Use of uninitialized value in string at ./pfinal.pl line 123, <> line 1.
Use of uninitialized value in string at ./pfinal.pl line 124, <> line 1.
Use of uninitialized value in string at ./pfinal.pl line 125, <> line 1.
Use of uninitialized value in string at ./pfinal.pl line 126, <> line 1.
Use of uninitialized value in string at ./pfinal.pl line 127, <> line 1.

Pongo aqui tambien el bucle tal y como esta ahora mismo por si sirve de ayuda:
Código: Seleccionar todo
if ($primero eq '$')
    {
   ##print "Entro en el bucle 1";
   my $uid = substr($linea, 1, 5);
   my $sth2=$dbh1->prepare("SELECT orden FROM ordenes_3 WHERE destino_orden='$uid' AND ack_orden='0'")
       or die $dbh1->errstr;
   $sth2->execute()        or die $sth2->errstr;
   my @orden;
   while (@orden=$sth2->fetchrow_array())
   {
       next unless $orden[0];
       my $orden = '$';
       $orden .= '@OC' . "'$orden[6]'";
       $orden .= 'UID' . "'$orden[4]'";
       $orden .= 'FEC' . "'$orden[2]'";
       $orden .= 'TIE' . "'$orden[3]'";
       $orden .= '@OD' . "'$orden[5]'";
       $orden .= '@OT' . "'$orden[6]'";
       $orden .= '@OR' . "'$orden[7]'";
       $orden .= '@OP' . "'$orden[8]'";
       ##my @oi = qw( 6   4   2   3   5   6   7   8);
       ##my @ot = qw( @OC UID FEC TIE @OD @OT @OR @OP );
       ##next unless $orden[0];
       ##my $orden = '$' . join(' ', map{"$ot[$_]'$orden[$oi[$_]]'"} 0..$#oi);
       print "$orden\n";
   }
    }
Dependiendo de si quiero probar una forma u otra le quito los comentarios a una y los pongo en la otra.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-10-11 04:20 @222

Coloca un
Código: Seleccionar todo
print "@orden\n";
justo después del 'while (...) {' para que te muestre qué es lo que ha sacado de la base de datos.
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-10-11 05:49 @284

Vale ya lo he resuelto, fallaba entre otras cosas porque en el SELECT, estaba sacando solo el campo orden como puedes ver. Tambien he quitado las comillas simples de los campos "'$orden[]'", ahora es "$orden[]"; y creo que va bien, ya te voy contando. Muchas gracias.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor Josmanue » 2006-10-13 07:25 @350

Hay que agregarle una funcion más al programa. El problema es el siguiente, hay una serie de máquinas que envían un 'UID' incorrecto, ya que está desfasado, en concreto 25 máquinas. Tengo una lista de estos 'UID' antiguos con los correspondientes actualizados. el programa debera antes de nada comprobar si el 'UID' que llega pertecece a la lista, si es así, cambiarlo por el correspondiente y a partir de ahí seguir con el programa. ¿Alguna idea?
Supongo que lo mejor sera hacer una funcion, ya que tengo que usarla al principo de cada bucle, "if ($primero eq '$')", "elsif ($primero eq '@')" y "elsif ($primero eq '#')"
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 2 invitados