• Publicidad

Cómo hacer un array en base a la entrada de otro array

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

Cómo hacer un array en base a la entrada de otro array

Notapor victorhugo » 2011-05-04 10:27 @477

Buen día, soy nuevo programando en Perl.

En estos días he tenido que hacer un programilla.

Realizo una conexión con una tabla de MySQL para observar los datos de la tabla, los cuales se guardan en un array. Que sucede yo necesito sacar un campo de ese array, el cual contiene a su vez unos registros.

Ejemplo, tengo lo siguiente:

while( @data = $consulta->fetchrow_array() ){
my $name = $data[2];
my $history_type_id = $data[1];
my $ticket_id = $data[0];
my $create_time = $data[3];

donde el vector guarda los datos de la tabla ticket. Sucede que en $data[3] se almacena el campo del tiempo y se necesita que los registro de ese campo tiempo para realizar cálculos de uno sobre otro, pero el campo es leídos como escalar.

La pregunta es: ¿cómo puedo asignar ese escalar como array y que tome los registros como entradas del array. Es decir, ejemplo: $data[3]= @time(2011-4-7 5:00:00, 2011-4-7 5:30:56) para poder realizar restas a las fechas.

Si no se logra entender, disculpen, soy nuevo.
Gracias, feliz día.
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Publicidad

Re: Cómo hacer un array en base a la entrada de otro array

Notapor explorer » 2011-05-04 11:22 @515

Bienvenido a los foros de Perl en español, victorhugo.

A ver si lo he entendido...

Dices que estás leyendo de una base de datos, y que un campo de fecha se convierte en un escalar. Y que lo que quieres es que en realidad contenga un array de datos.

Pero... ¿quién quieres que haga la resta de fechas? ¿MySQL o tu programa?

Lo que se suele hacer, normalmente, es convertir el escalar leído desde la base de datos, a un objeto DateTime. Para eso se puede usar el módulo DateTime::Format::MySQL. Una vez que tengamos en nuestro programa ese objeto DateTime, ya podremos hacer operaciones matemáticas con él.
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

Re: Cómo hacer un array en base a la entrada de otro array

Notapor victorhugo » 2011-05-04 13:29 @603

Exacto, el primer array es de la tabla general y el segundo array que debería crear con un split() es un llamado al campo tiempo del primero, de modo que los registros del array tiempo sean entradas [0,1,2,etc].

Luego de leer y mostrar los datos del array, la resta va ser más sencilla, aunque no he encontrado aún una función en MySQL para restar fechas de formato yy:mm:dd hh:mm:ss (2011-4-5 3:00:40), aunque pueden ser cualquiera de los dos que haga la operación de resta. Mejor sería el programa.

Disculpa que modifique tanto el mensaje. Según unas fuentes consultadas de la web esto

$time= @data[3]; @tiempo = split( /;/,$time)

define la columna que requiero convertir en array para hacer luego la resta.

Gracias por responder.
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Re: Cómo hacer un array en base a la entrada de otro array

Notapor explorer » 2011-05-04 17:52 @786

Pero el split(), lo que hace es partir un escalar según la expresión regular que le indiquemos. En este caso, es el carácter ';'. Y ese carácter no aparece en una cadena como '2011-4-5 3:00:40'.

¿Y luego, cómo vas a hacer la resta?

Te recomiendo que mires la familia DateTime, y en particular, el módulo que te he indicado.
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

Re: Cómo hacer un array en base a la entrada de otro array

Notapor victorhugo » 2011-05-05 08:33 @398

Buenos días,

Muchas gracias por la respuesta.

La idea del programa es restar las fechas y las horas y que muestre la diferencia entre ellas. Explico:

la fecha1 = 2011-7-5 4:00:25, y fecha2 = 2011-7-8 6:12:06

donde fecha total = fecha2 - fecha1 = 0000-0-3 2:12:01 o algo así.

Lo que sucede es que las fechas están almacenadas en una tabla de la base de datos MySQL, en un campo llamado create_time. Mi enredo es que debo sacar esos datos para restados en Perl o lo puedo hacer en MySQL.

Voy a revisar el módulo que dices.

Me gusta mucho este foro, ayuda mucho. Gracias, nuevamente...
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Re: Cómo hacer un array en base a la entrada de otro array

Notapor explorer » 2011-05-05 19:24 @850

En MySQL puedes usar algunas de las funciones *DIFF() para calcular la diferencia, pero fíjate bien, porque no son completas. Por ejemplo, DATE_DIFF() calcula la diferencia en días, por lo que no podrás saber la diferencia que hay en horas o periodos inferiores a un día o divisores de tiempos menores a un día.

Con TIMESTAMPDIFF() deberás escoger la unidad de diferencia. Y aún así, el resultado puede ser complicado de interpretar.

Depende de lo que quieres conseguir.
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

Re: Cómo hacer un array en base a la entrada de otro array

Notapor panterozo » 2011-05-05 21:58 @957

victorhugo:

Si se trata de manejar fechas, sumar o restar, yo le dejaría el trabajo a MySQL.

Échale una mirada a la documentación de MySQL sobre manejo de fechas.

¡¡Saludos!!

No vi el link dado por explorer :s, pero ahora lo tienes en español, también ;)
panterozo
Perlero nuevo
Perlero nuevo
 
Mensajes: 160
Registrado: 2010-01-26 08:36 @400

Re: Cómo hacer un array en base a la entrada de otro array

Notapor victorhugo » 2011-05-06 14:01 @626

Buenas tardes, muchas gracias a los dos por responder y ayudar.

Hay un aspecto que salté: yo, dentro de mi array tengo una tablas llamada tickect_history; tiene varios campos y el que me interesa es el tiempo el cual al crear la conexión queda en la posición @data[3] del array data. Lo que sucede es que las fechas son registros de ese campo. Yo los necesito a cada uno por separado para restarlos y sucede que los llama a todos juntos al hacer un split() o al crear otro array. Ese es el problema.

Gracias por su atención, explorer, el foro es de mucha ayuda; además de la documentación. Gracias, feliz día.
VHMR
victorhugo
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2011-05-04 10:01 @459

Re: Cómo hacer un array en base a la entrada de otro array

Notapor explorer » 2011-05-06 14:19 @638

Yo creo que te refieres a $data[3], no a @data[3].

Si quieres ver qué es lo que hay dentro de $data[3], escribe, en alguna parte del programa:

use Data::Dumper;
print Dumper($data[3]);

Así sabrás si es un escalar, o si es array, lo que hay dentro.

En caso de ser un escalar, deberás extraer la información de tiempo, bien con split(), bien con expresiones regulares, o bien con módulos como DateTime::Format::MySQL.

Danos una muestra de lo que recibes y luego, que es lo que te gustaría tener.
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


Volver a Básico

¿Quién está conectado?

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