Mar Sep 04, 2007 10:54 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
No estaría demás que prestáramos un poco de atención al formateo del código, y a nuestra propia sintaxis española.
Para lo primero, cuestión de hacer una vista previa a enviar el mensaje (que siempre se puede volver a reeditar, más tarde). Recordar además que en Perl existe el perltidy que nos formatea el código gratuitamente.
Para lo segundo, es recomendable el uso de Firefox junto el diccionario de Español.
Finalmente, recuerdo a todos que esto es un foro, no un teléfono móvil. |
|
|
|
Mar Sep 04, 2007 12:15 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
me quedé en las mismas...
¿Algo así como que mi código está algo revuelto? ¿o que digo demasiado sin ir al grano...  |
|
Mar Sep 04, 2007 12:19 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|

Mar Sep 04, 2007 12:35 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
No, lo que quiero decir es que tu mensaje debería parecerse a esto:
Ya pude hacer la inserción pero ahora me topo con el siguiente problema...
Necesito leer la base de datos: listo
Necesito guardar lo leído en un .dat: listo
Mover este archivo a otra carpeta: listo
Pero ahora necesito leer ese archivo .dat con la nueva información que se va a estar extrayendo (por medio de un cron) y determinar si es igual o diferente.
Si es igual, se queda el archivo tal cual.
Si es diferente, manda una alarma (no sobreescribe ese archivo .dat, si no que crea otro). Algo así como un if que crea un archivo llamado 'X1'. Pasa un minuto y se vuelve a crear otro archivo 'X2' y se activa el if: si X1 = X2 no hace nada puesto que son iguales. Pasa otro minuto, se crea, (o más bien se lee) otro archivo X3 nuevamente, se activa el if, pero en esta ocasión X1 es diferente de X3. Si esto pasa se crea un archivo Y2 y el sistema manda una alarma, pero no se borra X1).
Este es mi código: | Perl: | # Realizamos la etapa de preparación de la sentencia
my $sth = $dbh-> prepare("SELECT idups,nombre,idsitio,ip,vendor,snmpro,modelo,estado,host,idcliente,usuario,password,fecha_add,fecha_kill,umbral_carga,trespaldo FROM ups;");
# Realizamos la etapa de ejecución de la sentencia
$sth-> execute();
#------------------------------
# Realizamos la etapa de extracción de datos. Imprimimos dato a dato.
while ( @tupla= $sth-> fetchrow_array()) {
my $s = @tupla [0];
my $s1 = @tupla [1];
my $s2 = @tupla [2];
my $s3 = @tupla [3];
my $s4 = @tupla [4];
my $s5 = @tupla [5];
my $s6 = @tupla [6];
# Para separar por : y guardar en una sola variable
my $s7 = "$s:$s1:$s2:$s3:$s4:$s5:$s6";
print "--------------\n";
print "$s7\n";
open (Dat, ">>$tabla.dat");
print Dat "$s7\n$h";
close(Dat );
#-----------------------------------------------------------------
my $file;
open my $file, '<', "tabla.dat" or die("No se pudo abrir archivo");
my $texto = do { local $/; < $file> };
close $file;
print "-------------------------------------\n";
print $texto; |
En la parte de leer el archivo es donde tengo problemas más que nada para hacer las comparaciones de texto... (recordando que en el .dat la información se ve así):
| Código: |
1:APODACA:1:172.26.2.127:Unico
2:APODACA:1:172.26.2.127:Unico |
|
|

Mar Sep 04, 2007 12:40 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
| Aunque habría algunas cosas que comentar en el código, como errores fatales de escritura (aunque funciona), si sólo te interesa saber si ha habido cambios entre ficheros, sin importar su contenido, valdría con comparar su tamaño (-s) y su fecha de modificación (-M), con lo que ni siquiera tendrías que leerlos. |
|

Mar Sep 04, 2007 1:03 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
Como este foro lo van a ver más personas (y robots), reescribo aquí la parte de código publicado por Kiloko:
| Perl: | # Realizamos la etapa de preparación de la sentencia
my $sth
= $dbh-> prepare(
'SELECT '
. 'idups, nombre, idsitio, ip, vendor, '
. 'snmpro, modelo, estado, host, '
. 'idcliente, usuario, password, fecha_add, '
. 'fecha_kill, umbral_carga, trespaldo '
. 'FROM '
. 'ups; '
);
# Realizamos la etapa de ejecución de la sentencia
$sth-> execute();
#------------------------------
# Realizamos la etapa de extracción de datos. Imprimimos dato a dato.
while ( @tupla = $sth-> fetchrow_array() ) {
# Para separar por : y guardar en una sola variable
my $s7 = join ':', @tupla[0.. 6];
print "--------------\n";
print "$s7\n";
open DAT, ">>$tabla.dat";
print DAT "$s7\n$h";
close DAT;
#-----------------------------------------------------------------
my $texto = do {
open my $file, '<', "tabla.dat" or die "No se pudo abrir archivo: $!";
local $/;
< $file>;
};
print "-------------------------------------\n";
print $texto; | La forma my $s = @tupla [0];, aunque funcional, no es correcta, ya que, realmente, lo que estás haciendo en esa línea es adjudicar el primer elemento de la lista de valores devueltos por el array @tupla entre los elementos 0 y 0, a la variable escalar $s, que como ves, es demasiado complicado.
Realmente, lo que quieres es adjudicar el primer elemento de @tupla a $s, y eso se hace con my $s = $tupla[0]; (atención a los sigil),
Bueno, tu tranquilo que estas cosas se aprenden poco a poco...
Ultima edición por explorer el Mar Sep 04, 2007 2:49 pm, editado 1 vez |
|

Mar Sep 04, 2007 2:43 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
Algo raro pasa me marca un error aquí:
y ya traté de cambiarlo por
Pero a un así aparece el error.
| Código: |
syntax error at Ejemplo.pl line 45, near "open "
Execution of Ejemplo.pl aborted due to compilation errors. |
Saludos...
 |
|
Mar Sep 04, 2007 2:49 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
A ver ahora... he quitado el paréntesis del 'open'.
He hecho un perl -c y no me da fallos. Sólo falta por poner una '}' al final, pero tu tampoco la tenías puesta. |
|
Mar Sep 04, 2007 2:56 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
Quién sabe qué pasó, pero ya no jala jajajaja, ah, que cosa, a ver, déjame darle una revisada nuevamente al código, al que tenía y al que pusiste a ver dónde está la falla... |
|

Mar Sep 04, 2007 3:45 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
como que hoy PErl anda medio raro,, pues ya jala, asi quedo el codigo:
| Perl: | #Realizamos la etapa de preparación de la sentencia
my $sth= $dbh-> prepare( 'SELECT '
. 'idups, nombre, idsitio, ip, vendor, '
. 'snmpro, modelo, estado, host, '
. 'idcliente, usuario, password, fecha_add, '
. 'fecha_kill, umbral_carga, trespaldo '
. 'FROM '. 'ups; ');
#Realizamos la etapa de ejecución de la sentencia
$sth-> execute();
#Realizamos la etapa de extracción de datos. Imprimimos dato a dato.
while ( @tupla= $sth-> fetchrow_array())
{
#Para separar por : y guardar en una sola variable
my $s7 = join ':', @tupla[0.. 6];
print "$s7\n";
open DAT, ">>$tabla.dat";
print DAT "$s7\n$h";
close DAT;
my $texto = do
{
open my $file, '<', "$tabla.dat" or die "No se pudo abrir archivo: $!";
local $/;
< $file>; };
#Creamos y movemos un archivo .dat que contiene la información requerida.
my $oldlocation = "/home/ups/bin/$tabla.dat";
my $newlocation = "/home/ups/config/$tabla.dat";
move ($oldlocation, $newlocation);
}
#Realizamos la etapa de liberación de recursos ocupados por la sentencia
$sth-> finish();
#Nos desconectamos de la BD. Mostramos un mensaje si hay algun fallo
$dbh-> disconnect || warn "\nFallo al desconectar No es la ostia.\nError: $DBI::errstr\n";
#Terminamos
exit; |
Al parecer el error estaba en los { }
PEro a hora el error que da es, si yo ejecuto el programa en la terminal aparece:
1:APODACA:0:123.45.6.789:Tripplite:SHCP2007AXTEL:
2:APODACA:1:123.45.6.789:Tripplite:SHCP2007AXTEL:
Y cuando se genera el .dat aparece:
2:APODACA:1:123.45.6.789:Tripplite:SHCP2007AXTEL:
2007-8-4-16-39
Falta la primera linea,, que raro,,
Por cierto en esta parte
| Perl: | [syntax= "perl"]my $texto = do
{
open my $file, '<', "$tabla.dat" or die "No se pudo abrir archivo: $!";
local $/;
< $file>; }; | [/syntax:2b3f137883]
Quiero entender que es solo una alarma que alerta si el archivo no se pudo abrir, pero no comprendo del todo el local $/;
Voy a continuar revisando por que no sale la primera linea
por cierto estas ' no las tiene mi teclado,, generalmente uso ", pero por lo visto se puede reducir el numero de lineas,,,
Un saludo |
|

Mar Sep 04, 2007 3:59 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
Yo desisto... no editaré más mensajes de Kiloko... Me he cansado.  |
|
Mar Sep 04, 2007 4:02 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
jajajaja ok ok sere mas conciso en mis mensajes,  |
|

Mar Sep 04, 2007 4:12 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
El 'local $/;' es algo así como crear una variable local (al contexto {} donde estamos), almacenando el antiguo valor de $/ en un sitio seguro para recuperarlo al final del contexto, y asignando a la nueva variable el valor indefinido (mucho para pocas letras).
El resultado es que el valor de '$/' fuera del contexto se mantiene, pero dentro, adquiere el valor indefinido, que tiene como efecto (in)definir el valor del separador de registros a la entrada.
Por defecto, ese valor es el del retorno de carro/nueva línea en el sistema operativo en que nos encontremos. De esa manera, hay leer desde un fichero, podremos leerlo línea a línea. Pero al indefinirlo, Perl lo leerá completamente (digamos que no encuentra un valor que marque fin de registro), por lo que nos devolverá el fichero entero, de una sola vez.
Por eso el resultado se guarda en un escalar, porque es todo el fichero en un solo valor. |
|

Mar Sep 04, 2007 4:15 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
| Kiloko escribió: | jajajaja ok ok sere mas conciso en mis mensajes,  | Yo no edito los mensajes para hacerlos más breves, sino para corregir el formateo de las secciones de código y citas. Y para corregir las faltas de ortografía, sintaxis, abreviaturas, anglicismos, etc.
No es para que quede bonito, sino para que Google nos ayude a atraer más usuarios. |
|

Mar Sep 04, 2007 4:27 pm
|
 |
Kiloko
Perlero Adicto

|
Registrado: 10 Jul 2007
Mensajes: 244
Ubicación: MOnterrey NL
|
|
|
|
|
OK enterado se que mi programación no es muy buena pero tratare de mejorar.
ya como ultimo.
Aqui esta el codigo final: con esto se soluciona el problema del .dat
En lo personal Trato de poner los { } más adelante, para no perder donde se cierra cada uno.
| Perl: | #Realizamos la etapa de extracción de datos.
while ( @tupla= $sth-> fetchrow_array())
{
#Para separar por : y guardar en una sola variable
my $s7 = join ':', @tupla[0.. 6];
print "$s7\n";
open DAT, ">>$tabla.dat";
print DAT "$s7\n";
close DAT;
my $texto = do
{
open my $file, '<', "$tabla.dat" or die "No se pudo abrir archivo: $!";local $/; < $file>;
}
} |
Saludos. |
|
Powered by phpBB © 2001, 2005 phpBB Group
|