• 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 explorer » 2006-10-06 09:59 @457

Se me ocurre que podemos atacar el problema desde otro flanco.
Podríamos primero mirar el primer carácter de la $linea y de esa manera hacer una primera discriminación:
Código: Seleccionar todo
  # leemos la línea...

  # Discriminamos según el primer carácter:
  my $primero = substr( $linea, 0, 1 );
  if ( $primero eq '$' ) {
    # Se ha recibido un 'estoy vivo'
  }
  elsif ( $primero eq '@' ) {
    # Se ha recibido una confirmación de orden
  }
  elsif ( $primero eq '#' ) {
    # Se ha recibido una trama
    if ( ($fuente,$trama) = $linea =~ /^#(1|2)(.+)$/ ) {
      if ( $trama =~ /\@/ ) {
        # Trama de órdenes
      }
      else {
        # Trama normal
      }
    }
    else {
       die "ERROR: Se ha recibido algo con '#' pero no es una trama!\n";
    }
  }
  else {
    die "ERROR: La linea recibida no comienza por un carácter reconocido!\n";
  }
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

Publicidad

Notapor Josmanue » 2006-10-09 06:12 @300

Ok muchisimas gracias, ahora si me distingue bien las cadenas.. o eso creo. Ahora el problema es otro, no se si es derivado de los cambios que hemos hecho. supongo que debe estar en la parte de código de insertar las ordenes en la tabla ordenes:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if (($fuente, $trama) = $linea =~/^#(1|2)(.+)$/)
{
    if ($trama =~/\@/)
    {
        ##print "Fuente:$fuente, $trama\n";
        while ($trama =~/($campos2)/g)
        {
            my ($campo, $valor) = unpack("A3 A*", $1);
            ##print "\t$campo\t$valor\n";

            if ($campo eq 'TIE') { $valor = join(':', $valor =~ /(..)/g) }
            $trama{$campo} = $valor;
        }
        my %campos2_bd = (
            UID => 'origen_orden', FEC => 'fecha_recepcion', TIE => 'hora_recepcion',
            '@OD' => 'destino_orden', '@OT' => 'tipo_orden', '@OD' => 'orden', '@OP' => 'prioridad',
        );
        my $sql_or ='INSERT INTO ordenes SET ';
        $sql_or   .=    join( ', ',
                        map  { "$campos2_bd{$_} = \'$trama{$_}\'" }
                        grep {      defined $campos2_bd{$_}       }
                        keys %trama
        );
        $sql_or   .= ';';

        ##print " la cadena sql_or tiene: $sql_or\n";

        my $filas = $dbh1->do($sql_or)
                    or die $dbh1->errstr;
        print "\$INFOK*\r\n";

    }

    else
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Y la insercion que me hace en la tabla es esta:
Código: Seleccionar todo
| id_orden | timestamp           | fecha_envio | hora_envio | origen_orden | destino_orden | tipo_orden | orden | prioridad | ack_orden | fecha_recepcion | hora_recepcion |
+----------+---------------------+-------------+------------+--------------+---------------+------------+-------+-----------+-----------+-----------------+----------------+
|        1 | 2006-10-09 09:07:49 | 2005-01-01  |            | SP103        |               | ty0        | SP105 |         2 |         1 | 2006-10-05      | 12:30:00       |
|        2 | 2006-10-09 09:07:49 | 2005-01-01  |            | SP105        |               | tyr        | SP105 |         5 |         1 | 2006-10-06      | 09:00:00       |
|        3 | 2006-10-09 09:07:49 | 2005-01-01  |            | SP103        |               | ty0        | SP105 |         2 |         1 | 2006-10-09      | 09:00:00       |
|        4 | 2006-10-09 12:23:35 | 2005-01-01  |            | SF272        |               | MEN        | SF272 |         0 |         0 | 2006-10-09      | 12:22:05       |
+----------+---------------------+-------------+------------+--------------+---------------+------------+-------+-----------+-----------+-----------------+----------------+

No se si se ve muy claro pero bueno lo explico aqui. Lo que es la 'orden' campo '@OR' no lo pilla y en su lugar inserta lo que sería 'destino_orden', y este campo lo deja vacío. ¿Alguna idea para resolver esto?
Ah y en cuanto a los errores, no tienes porque desculparte, me estas ayudando un montón y te lo agradezco.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-10-09 06:38 @318

Revisa la variable %campos2_bd. Tienes puesto dos veces el campo '@OD'. Uno de ellos será '@OR'.
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 Josmanue » 2006-10-09 06:45 @323

UPS!!! :oops: Pues te prometo que llevo un rato mirandolo y no lo veía tio, un poco más y me da un bocao! Gracias, ahora supongo que ya irá bien.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor Josmanue » 2006-10-10 05:24 @267

A ver me da siempre el mismo aviso y no en tiendo muy bien por qué, bueno realment dos avisos, pero el primero sólo me lo da la primera vez que se ejecuta el programa y a partir de ahí me da siempre el otro. ¿De que puede ser? porque la verdad es que en la linea 111 no hay ninguna concatenacion.
Possible attempt to separate words with commas at ./pfinal.pl line 87.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 4.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 8.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 11.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 12.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 13.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 14.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 16.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 17.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 18.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 19.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 20.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 21.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 22.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 23.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 24.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 25.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 26.
Use of uninitialized value in concatenation (.)
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor Josmanue » 2006-10-10 05:55 @288

Y una cosita más, la parte en la que envía las ordenes,
Código: Seleccionar todo
if ($primero eq '$')
    {
   ##print "Entro en el bucle 1";
   my $sth2=$dbh1->prepare("SELECT orden FROM ordenes 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";
   }
   
    }
hay que modificarla, ya que las ordenes para que las máquinas las "entiendan" deben ir en un formato de cadena determinado. ¿como puedo sacar los campos y construir la cadena antes de enviar la orden?
La cadena debe tener exactamente el siguiente formato:
$@OC'tipo_orden'UID'origen_orden'FEC'fecha_envio'TIE'hora_envio'@OD'destino_orden'@OT'tipo_orden'@OR'orden'@OP'prioridad'
Lo que esta entre ' ' son los nombres de los campos de la tabla ordenes y sí, el campo 'tipo_orden' debe aparecer 2 veces en la cadena.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-10-10 06:22 @306

Josmanue escribiste:
Possible attempt to separate words with commas at ./pfinal.pl line 87.
Use of uninitialized value in concatenation (.) or string at ./pfinal.pl line 111, <> line 4.

Una concatenación se produce incluso dentro de unas comillas dobles.

Deberías haber puesto aquí la famosa línea 111.
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 Josmanue » 2006-10-10 06:27 @310

La linea 111 es:
Código: Seleccionar todo
   my $sth2=$dbh1->prepare("SELECT orden FROM ordenes_3 WHERE destino_orden='$uid' AND ack_orden='0'")
Que esta dentro del bucle if que he puesto algo más arriba que hay que cambiar.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-10-10 06:53 @328

Creo que podria ser algo así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
if ($primero eq '$')
{
    ##print "Entro en el bucle 1";
    my $sth2=$dbh1->prepare("SELECT orden FROM ordenes 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() )
    {
        # @orden contiene, en orden, los valores de los campos de la orden
        # Se supone que el orden de los valores es:
        # id_orden=0, timestamp, fecha_envio, hora_envio, origen_orden, destino_orden=5,
        # tipo_orden=6, orden, prioridad, ack_orden, fecha_recepcion y hora_recepcion=11
        # Hay que crear la orden para las máquinas, componiendola con los valores leídos
        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";
    }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Naturalmente, se ve que la composición de la orden se puede hacer de otra forma más corta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
        my @oi    = qw( 6   4   2   3   5   6   7   8   );
        my @ot    = qw( @OC UID FEC TIE @OD @OT @OR @OP );
        my $orden = '$' . join('', map { "$ot[$_]'$orden[$oi[$_]]'" } 0..$#oi);
        print "$orden\n";
 
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: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2006-10-10 06:55 @330

Josmanue escribiste:La linea 111 es:
Código: Seleccionar todo
   my $sth2=$dbh1->prepare("SELECT orden FROM ordenes_3 WHERE destino_orden='$uid' AND ack_orden='0'")
Que esta dentro del bucle if que he puesto algo más arriba que hay que cambiar.

Pues entonces el error se refiere a que la variable $uid no tiene ningún valor.
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

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

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