• 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-07-28 02:01 @126

Vaya curro guapo tio! ¿Y eso funciona de verdad? No sabía que se tuviera tanto control de los incendios desde los satélites. Aunque una idea mucho mejor sería hacer un control sobre los ijoputas que le meten fuego al campo.... para eso no hay programa ¿no? :wink:
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Publicidad

Notapor Josmanue » 2006-07-28 04:50 @243

A ver, un par de cositas mas ya a la hora de insertar:

La primera es que el campo TIE que tiene formato hhmmss (la hora) y a la hora de insertarlo en la tabla tiene que ser con el formato hh:mm:ss y hay que hacerlo antes de insertar ya que la tabla no le da formato, sólo guarda el texto que le inserte.

Se me había ocurrido dentro del While:
Código: Seleccionar todo
if ($campo eq 'TIE')
{
    ($HH,$MM,$SS) = $valor =~ /(..)(..)(..)/;
    $valor = $HH:$MM:$SS;
}

Pero evidentemente no va, ¿cual es la forma correcta de hacerlo?

La segunda cuestion, y esta ya es la parte final del programa, hay que decidir en que servidor y BD se insertan los campos, me explico:

Hay dos servidores (En principio sólo hay 2 aunque en el futuro puede haber más), supongamos por ejemplo:
BD1: Jose1 en el servidor principal Jose1(Jose1p.manuel.com) puerto: 3336
BD2: Jose2 en el servidor Jose2(Jose1p.manuel.com) puerto: 3337


En la Base de datos Jose1 hay una tabla con 2 campos: 'UID' y 'servicio'

Pues el problema es el siguiente:
Hay que buscar el UID que viene en la cadena, compararlo en esta tabla, ver con que servicio se corresponde y si servicio=3 los datos se insertarán en el servidor principal Jose1 y si servicio=5, lo haran en el servidor Jose2.
Espero que esté claro, yo me lio bastante con el tema de los puertos, la verdad.

¿Qué? ¿como se te queda el cuerpo? je je. A ver si me puedes echar una mano. Gracias.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-07-28 07:54 @371

Varias formas:
Extracción de los tres campos por indicación de su tamaño por medio de comodines '.', e interpolación de las variables por efecto de las comillas dobles.
Código: Seleccionar todo
($HH,$MM,$SS) = $valor =~ /(..)(..)(..)/; # tres campos de dos caracteres
$valor = "$HH:$MM:$SS";

Extracción de los tres campos por el mismo método, de forma repetida, porque son todos iguales (del mismo tamaño):
Código: Seleccionar todo
($HH,$MM,$SS) = $valor =~ /(..)/g; # Recorremos $valor en grupos de dos caracteres
$valor = "$HH:$MM:$SS";

En vez de guardarlo en 3 variables sueltas, lo podemos guardar en un array:
Código: Seleccionar todo
@x = $valor =~ /(..)/g; # Lo mismo, pero ahora en vez de 3 variable, sólo un array
$valor = join(":",@x);  # y unión con joint
que es lo mismo que decir
Código: Seleccionar todo
$valor = join(":", $valor =~ /(..)/g); # Todo en una línea: división y unión. Nos ahorramos una variable temporal

Otra forma: si sólo necesitamos dos ':', pues los ponemos en su sitio:
Código: Seleccionar todo
substr($valor,2,0)=":";
substr($valor,5,0)=":";

Y para lo último, tu mismo lo has dicho:
Código: Seleccionar todo
if ( $UID == 3 ) {
    # Abrir conexión con servidor Jose1
    # ... connect
} else {
    # Abrir conexión con servidor Jose2
    # ... connect
}

# Publicación en la base de datos...
# ... insert o update
Última edición por explorer el 2006-08-09 07:38 @360, editado 3 veces en total
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2006-07-28 09:02 @418

Josmanue escribiste:Vaya curro guapo tio! ¿Y eso funciona de verdad?

Tu mismo lo puedes ver:
* Incendios activos
* Riesgo de incendio
(por la tele :))

Yo servía datos en varios formatos (correo electrónico, XML, teletexto). Incluso surgió la posibilidad de hacer lo siguiente: como nosotros sabemos a nivel de municipio dónde se está produciendo un incendio, habíamos pensado en la posibilidad de enviar a las fuerzas de tierra, a la cuadrilla correspondiente, un SMS para informarles del lugar, hora de inicio, última dirección de desplazamiento conocida, etc. Gracias al nuevo meteosat se puede saber todo eso cada 15 minutos.

Josmanue escribiste:No sabía que se tuviera tanto control de los incendios desde los satélites. Aunque una idea mucho mejor sería hacer un control sobre los ijoputas que le meten fuego al campo.... para eso no hay programa ¿no? :wink:

Hummm... se podría hacer... lo que falta es voluntad de poner los medios... Tu fíjate lo que sucede en lugares como los grandes bosques de Estados Unidos y Canadá, cerca de las zonas más cálidas. Allí tienen torres de vigilancia cada cierto número de kilómetros, abarcando toda la zona. Anteriormente en todas ellas estaban ocupados por guardabosques (algunas lo siguen estando en las zonas más problemáticas), pero la mayoría tienen ahora cámaras sensibles al calor, todas ellas conectadas por satélite o telefonía. Si un sólo arbusto empieza a arder, se enteran en muy pocos minutos. Lo más parecido que tenemos en España es en la comunidad de Madrid, que han puesto chips a los árboles, en algunos bosques del norte de la capital. Si un sólo árbol empieza a arder, este se lo comunica a central. Pero no tengo datos de cómo lo hacen.

Pero lo que dices es cierto, los cabrones que se dedican a quemar (por el motivo que sea, que hay varios), son muy difíciles de controlar. Había oído algo de que en Austria, Francia y Alemanía había algunas zonas que tenían instalado cámaras de detección de calor automáticas, pero no para los fuegos, sino para las personas, de tal forma que con un par de cámaras tenían controlado todo un valle (no demasiado frondoso, claro). Pero esto era un caso muy especial, bosques centroeuropeos de esos que para entrar en ellos tienes que pararte antes en la caseta del guardabosques y una cámara fija le hace una foto al coche... hacer cosas de esas por aquí es algo... muy lejano... Como mucho, lo único que podemos hacer es hacer limpieza de montes y cortafuegos, que, a mi modo de pensar es como darse por vencido... es como si dijéramos: sabemos que se va a producir fuego, así que haremos que sea con el menor daño posible. Además, para los que nos gusta la naturaleza, ya el mismo término limpieza de montes es un concepto terrible, porque rompes algunas cadenas tróficas. Es como si convirtiéramos un bosque frondoso en una parque metropolitano... bonito, pero no natural.

Piensa una cosa... me dicen que en los bosques de Ávila y Segovia ocurren pocos incendios. Y es porque por aquella zona viven de la madera y saben cuidar sus bosques. Así que allí hay intereses en la producción de madera, pero no en quemarla. En el resto de España... habrá que ir pensando en aprender a llevar camellos.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-07-31 02:38 @151

A ver algunos problemillas más:

El primero es una tontería pero no doy con la tecla y no puedo seguir, me da un fallo de compilación y creo que es de esto (eso espero). El problema es que no me reconoce la tangente, y tu diras que torpe soy!, pues seguramente, pero llevo todo el fin de semana mirando en libros y en ninguno viene una lista de las funciones matemáticas ni nada de eso, se escribe "tan" verdad?? La cosa es que de estos campos calculados hay senos, cosenos y tangentes y hago:

sin($Latitud_Rad) #y me pone el 'sin' de amarillo como los demas simbolos
cos($Latitud_Rad) #y lo mismo, de amarillo, pero con:

tan($Latitud_Rad) # me pone 'tan' de azul como si fuera una costante!!!

y no entiendo por qué no lo reconoce, en perl no había que poner librerias matemáticas ni nada de eso como en el 'C' verdad???
No se, help!

Otra cosa, sobre lo que me dijiste:
if ( $UID == 3 ) {
# Abrir conexión con servidor Jose1
# ... connect
} else {
# Abrir conexión con servidor Jose2
# ... connect
}

# Publicación en la base de datos...
# ... insert o update


en realidad, creo que no va así, 'UID' no vale 3 nunca, 'UID' puede ser por ejemplo "moto3", entonces hay que ver en la tabla "servicios" de Jose1, qué servicio corresponde a "moto3", y si es 3, entonces se inserta todo en Jose1 y si es 5, se inserta todo en Jose2.
Entonces, primero debería conectarme a Jose1 y extraer el "servicio" que corresponde al 'UID' de la cadena no?

Y mi ultima duda (de momento) acerca del insert. La cadena que le mando con los campos separados por comas:
INSERT INTO tabla SET LON = 'xxxx,xxxx', SLA = 'x', SLO = 'x', UID = 'xxxxx', LAT = 'xxxx,xxxx', ALT = 'xxxxx', TIE = 'xxxxxx', FEC = 'xxxxxx';


¿Tienen que ir en el mismo orden que estan los campos en la Base de Datos?

Gracias.

P.D. Siento decirte que no soy muy dado a mirar los teletextos, pero a partir de ahora miraré la información de los incendios de vez en cuando y me acordaré de ti. Tiene que ser cojonudo ver tu trabajo o parte de él cada vez que quieras en la tele eh!
Ciao y de nuevo Gracias.
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-07-31 06:30 @312

La función tan no existe en Perl. Sí que existe la arcotangente. ¿Por qué no existe la función tangente? pues porque hay una forma muy fácil de hacerla.

Sobre las conexiones a las bases de datos, puedes realizarlas al principio del programa, a los dos servidores, y luego en función de las necesidades o valores encontrados, llevar la petición a uno u otro.

Sobre el orden de los campos. Si utilizas la sintáxis que he puesto, verás que aparecen los nombres de los campos, con lo que nos da igual ese orden. De eso ya se ocupa la base de datos. Sí que habría que ponerlos en orden en caso de usar la otra sintáxis de INSERT, en la que se indican sólo los valores.

La información de los teletextos es sólo para el público en general. Los equipos de emergencias tienen mucha más información y de forma más rápida. Y tienes razón en lo del orgullo. Aunque desde finales del año pasado ya no trabajo en eso -me despedí-, uno se siente orgulloso de que sus programas siguen funcionando perfectamente... :wink:

Una cosa... si estás usando trigonometría para hallar distancias basadas en longitud/latitud, todo eso ya está hecho en Geo::Distancie, pero si lo que te interesa saber es, dados dos puntos, calcular distancia y orientación (grados), entonces eso se puede hacer con Geo::Ellipsoid y Geo::Coordinates::DecimalDegrees.

Ejemplo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl
use Geo::Ellipsoid;
use Geo::Coordinates::DecimalDegrees;

# Creamos nuestro objeto Geo::Ellipsoid,
# basado en el elipsoide más moderno y más aceptado
my $geo = Geo::Ellipsoid->new(ellipsoid=>'WGS84', units=>'degrees');

my @origen_lat = ( 42, 36,  4 );  # Posición de León
my @origen_lon = ( -5, 33, 56 );

my @destino_lat= ( 41, 38, 55 );  # Posición de Valladolid
my @destino_lon= ( -4, 40, 55 );

# Conversión de grados, minutos y segundos a decimal
my $origen_lat = dms2decimal( @origen_lat );
my $origen_lon = dms2decimal( @origen_lon );
my $destino_lat= dms2decimal( @destino_lat);
my $destino_lon= dms2decimal( @destino_lon);

# Cálculo de la distancia y orientación
my ( $distancia, $orientacion ) = $geo->to(
    $origen_lat,
    $origen_lon,
    $destino_lat,
    $destino_lon
);

print "$distancia, $orientacion \n";  # 128574.943733421, 145.07409520328
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4
Efectivamente... Valladolid está a unos 128 kilómetros y a unos 145º de León.

En CPAN hay más módulos relacionados con el cálculo Geoespacial.
Última edición por explorer el 2006-08-27 22:31 @979, 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: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor explorer » 2006-08-07 11:12 @508

Pues primero haces un prepare() y luego un execute()... dos líneas.

Y si la $sql aparecen los campos vacíos, es que no se hace algo bien en el bucle donde se leen. Es como si $valor no contuviera nada. En mi bucle sí que salen todos los valores. ¿Qué sale con el print mientras lee los campos en el bucle?
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-08-09 03:18 @179

Un par de cositas. Al principio del programa he puesto:
$dsn = "DBI:mysql:database=$database;host=$host;port=$port";
$dbh = DBI->connect($dsn,$user,$password)
or die $DBI::errstr;

Si no me da ningún fallo extraño ni nada, ¿debo entender que se conecta sin problemas no??

Y lo último, suponiendo que la cadena con el insert que hemos creado y que ya le he añadido los campos calculados (el Easting y el Northing), suponiendo que está en $cadena_final, la orden para insertarlo sería asi?

$sth = $dbh->prepare($cadena_final);
$rv = $sth->execute;

He estado leyendo lo que me dijiste del 'prepare' y del 'execute' pero no se si lo he entendido bien, ¿perl entiende que tiene que hacer lo que hay en la variable $rv??

Ah :P , A ver si puedo conectarme luego al irc y te pillo por alli, muchísimas gracias por toda la ayuda que me estas dando, esto se me ha complicado más de lo que pensaba. :?
Última edición por Josmanue el 2006-08-09 11:16 @511, editado 1 vez en total
Josmanue
Perlero nuevo
Perlero nuevo
 
Mensajes: 76
Registrado: 2006-06-09 04:33 @231

Notapor explorer » 2006-08-09 04:39 @235

No hagas print "%trama";, sino print %trama;. Si sigue saliendo lo mismo, entonces sí que está pasando algo muy raro. Tendrás entonces que poner use warnings; al principio del programa para que te dé mas pistas.

Sobre la base de datos, mírate el tutorial de esta misma página web:
http://perlenespanol.com/archives-tut/000045.html
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Josmanue » 2006-08-09 05:40 @278

le meto la siguiente cadena:

#0UIDcami2FEC060825TIE090000VALALAT2525,1234SLANLON12525,1234SLOEALT00895VEL080
Última edición por Josmanue el 2006-08-09 11:14 @509, editado 1 vez en total
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 0 invitados

cron