Página 3 de 4

NotaPublicado: 2007-09-04 14:03 @627
por explorer
Como este foro lo van a ver más personas (y robots), reescribo aquí la parte de código publicado por Kiloko:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
# 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;
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
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...

NotaPublicado: 2007-09-04 15:43 @697
por Kiloko
:? Algo raro pasa me marca un error aquí:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    open  DAT,">>$tabla.dat");
    print DAT "$s7\n$h";
    close DAT;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


y ya traté de cambiarlo por

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
    open  (DAT,">>$tabla.dat");
    print DAT "$s7\n$h";
    close (DAT);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero a un así aparece el error.
Código: Seleccionar todo
syntax error at Ejemplo.pl line 45, near "open "
Execution of Ejemplo.pl aborted due to compilation errors.


Saludos...


:?:

NotaPublicado: 2007-09-04 15:49 @701
por explorer
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.

NotaPublicado: 2007-09-04 15:56 @705
por Kiloko
:lol: 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...

NotaPublicado: 2007-09-04 16:45 @739
por Kiloko
:lol: como que hoy PErl anda medio raro,, pues ya jala, asi quedo el codigo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#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;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
[syntax="perl"]my $texto = do
 {
 open my $file, '<', "$tabla.dat" or die "No se pudo abrir archivo: $!";
 local $/;
 <$file>; }; [/syntax]
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


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

NotaPublicado: 2007-09-04 16:59 @749
por explorer
Yo desisto... no editaré más mensajes de Kiloko... Me he cansado. :(

NotaPublicado: 2007-09-04 17:02 @751
por Kiloko
jajajaja ok ok sere mas conciso en mis mensajes, :P

NotaPublicado: 2007-09-04 17:12 @758
por explorer
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.

NotaPublicado: 2007-09-04 17:15 @760
por explorer
Kiloko escribiste:jajajaja ok ok sere mas conciso en mis mensajes, :P
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.

NotaPublicado: 2007-09-04 17:27 @769
por Kiloko
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.


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#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>;
 }
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Saludos.