• Publicidad

Formatear string

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Notapor creating021 » 2007-04-03 20:11 @882

Sí, ese método (substr) es más fácil que el de unpack, bueno al menos en este caso.

./separar.pl 1,3 7,8
¿Eso es bueno o malo?

Espero que bueno porque si no... hacer un par de if... :wink:
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

Publicidad

formatear string

Notapor xchidalgox » 2007-04-04 09:17 @429

El algoritmo funciona perfecto, graciassssss.

Una cosa mas

se puede identificar la columna a la que pertenece el dato entre *, me explico:

si la cadena es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1Pedro Perez      23232956'
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4

y hago un #perl separar.pl 1,6 entonces la cadena queda asi
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1*Pedro *Perez      23232956'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
entonces la columna es la 2. y solo listaria un '2'.

si la cadena es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1Pedro Perez      23232956'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y hago un #perl separar.pl 1,6 7,17 entonces la cadena queda asi
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1*Pedro *Perez      *23232956'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
entonces la columna es la 2 y la 3, y listaria '2' '3'.

si la cadena es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1Pedro Perez      23232956'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y hago un #perl separar.pl 7,17 1,6 entonces la cadena queda asi
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1*Pedro *Perez      *23232956'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
pero esta vez las columnas son la 3 y la 2 , y listaria '3' '2'. como los parametros se pasan cambiados con respesto al ejemplo anterior, la columna 3 se lista primero

si la cadena es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1Pedro Perez      23232956'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y hago un #perl separar.pl 1,6 24,25 entonces la cadena queda asi
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1*Pedro *Perez      232329*56*'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
entonces la columna es la 2 y la 4, y listaria '2' '4'.

Por ultimo, si la cadena es
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'1Pedro Perez      23232956'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y hago un #perl separar.pl 0,0 entonces la cadena queda asi
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
'*1*Pedro Perez      23232956'
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
entonces tambien es la columna 2, y listaria '2'. (es medio extraño, pero debe ser asi)

El orden de las columnas depende del orden en que se pasan los parametros.

Espero haberme explicado...

Saludos
xchidalgox
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-04-02 11:23 @516

Notapor explorer » 2007-04-05 04:56 @247

Osea... ¿que el caso 1,6 es igual al caso 0,0?
¿Cómo es posible?
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

formatear string

Notapor xchidalgox » 2007-04-05 08:42 @404

lo que pasa es que tengo que considerar que lo que esta a la izquierda del * es la columna, en el caso (1,6) '1' esta a la izquierda del * por lo tanto es la columna 1 y 'Pedro' esta a la derecha del * entonces es la columna 2

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
1*Pedro *Perez      23232956
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En el caso (0,0) la columna 1 esta vacia (a la izquierda del *) y la columna dos (a la derecha del *) es el dato '1'.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
*1*Pedro Perez      23232956
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Nunca sera la columna uno. (0,0) y (1,6) son la columna dos.

Una cosa mas si no se separa la (1,6) y si la (7,3) entonces 7,13 es la columna 2. Insisto es un poco extraño, pero asi es.


Saludos.
xchidalgox
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-04-02 11:23 @516

Notapor xchidalgox » 2007-04-06 10:37 @484

Alguna idea ??
xchidalgox
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-04-02 11:23 @516

Notapor explorer » 2007-04-06 11:20 @514

Se me ocurre que la solución sería: dado un '*' en una posición x, restar a ese x tantas unidades como '*' le preceden. Si luego la posición final corresponde con algunas de las posiciones que esperamos de un campo conocido, pues bien.

Pero lo sigo viendo muy complicado... habría que analizar si el número de '*' es par o no, para saber si hay algún caso de '*' que pertenece a dos campos a la vez.

Quizás la solución sea contar posiciones a partir de la izquierda e ir quitando los '*' a medida que los encontremos. Y teniendo además el caso excepcional de la primera columna.
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 xchidalgox » 2007-04-06 12:34 @565

Esto es lo que tengo hasta el momento

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
$col="2";
 for ($i=0;$i<$#ARGV;$i++)
    {
      $lista_col .="$col,"
      ($i_pos_ant,$f_pos_ant) = split(',',$ARGV[$i]);
      ($i_pos_act,$f_pos_act) = split(',',$ARGV[$i+1]);
     
         if ($f_pos_ant +1 == $i_pos_act)
         {
          $col = $col +1
         }
         else
             {
              $col = $col +2;
             }
    }  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


La estrategia es: si las posiciones están juntas (1,6 7,17) entonces es la columna siguiente (sumar 1). Si están separadas (0,0 7,17) es la columna subsiguiente (sumar 2). Pero solo funciona si las posiciones son pasadas de izquierda a derecha (0,0 1,6 7,11 12,...). Si se pasara 7,13 1,6 ya no funciona :'(

¿Cómo mejoro el algoritmo?

Saludos
xchidalgox
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-04-02 11:23 @516

Notapor xchidalgox » 2007-04-10 10:28 @477

acepto ideas ......
xchidalgox
Perlero nuevo
Perlero nuevo
 
Mensajes: 23
Registrado: 2007-04-02 11:23 @516

Notapor explorer » 2007-04-10 11:22 @515

Ordena los argumentos antes de procesarlos, algo así como:
@argumentos = sort @ARGV;
pero es más complicado, porque debes hacer un sort numérico y no alfabético como hace por defecto sort. Quizás una transformada de Schwartz te podría valer.
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 » 2007-04-11 04:22 @223

Tengo una idea...
Haces un hash del tipo
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
%posiciones = (
    '0,0'  => 2,
    '1,6'  => 2,
    '7,17' => 3,
);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
y luego sólo tienes que recorrer @ARGV y pintar los valores de $posiciones{$_}, ¡y ya está!

No tienes que analizar la cadena para nada. El usuario ya te lo da en la línea de argumentos.
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 Intermedio

¿Quién está conectado?

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

cron