• Publicidad

Base de datos en texto

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

Base de datos en texto

Notapor primitivo » 2013-07-05 19:36 @858

Hola :D

Ahora me encuentro creando una base de datos en .txt
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.  
  2. #Con esta función cuento las líneas que tiene el archivo.
  3. sub GetLines
  4. {
  5.     my $ARCH = shift;
  6.     my $lim;
  7.     open(DATA,$ARCH);
  8.     while (<DATA>)
  9.     {
  10.           $lim++;
  11.     }
  12.     close(DATA);
  13.     return($lim);
  14. }
  15.  
  16. #Esta es la función que me daría el registro de la database.
  17. sub do_bdd
  18. {
  19.     my $lines = &GetLines("system/database/admins/listado.txt");
  20.     my $busca_bdd = lc($lectura[4]);
  21.     my $lines_;
  22.     open(BD,"system/database/admins/listado.txt");
  23.     while (<BD>)
  24.     {
  25.         my $dest = <BD>;
  26.         chop($dest);
  27.         my @array = split(/:/,$dest);
  28.         if ($lines_ < $lines)
  29.         {
  30.                     if ($busca_bdd eq $array[0])
  31.                     {
  32.                                    screen("$BOTS{\"admin\"} P $UserDest :Coincidencia encontrada -> dato entregado '$busca_bdd' dato recibido '$array[0]'\n");
  33.                     } else {
  34.                            $lines_++;
  35.                     }
  36.         } else {
  37.                screen("$BOTS{\"admin\"} P $UserDest :se ha alcanzado la última línea y no hay nada que coincida, con el puntero en $lines_\n");
  38.         }
  39.     }
  40.     close(BD);
  41.    
  42.    
  43. }
  44.  
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


pero no logro lo que deseo ¿me ayudan? :D
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Publicidad

Re: Base de datos en texto

Notapor explorer » 2013-07-05 19:54 @871

En las líneas 23 y 25 estás realizando dos operaciones de lectura, con lo que pierdes una línea de cada dos, en el proceso.

Debes sustituirlas por solo esta:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1.     while (my $dest = <BD>) {
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Re: Base de datos en texto

Notapor primitivo » 2013-07-05 20:08 @880

De acuerdo explorer, pero no logro la condicion contraria que me diria que, el registro no lo encuentra, de resto marcha a la perfeccion.
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Base de datos en texto

Notapor primitivo » 2013-07-05 20:11 @882

Lo he cambiado por:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub do_busca {
  2.     my $dato_a_buscar = lc( $lectura[4] );
  3.     if ( &do_bdd($dato_a_buscar) == 1 ) {
  4.         screen("$BOTS{\"admin\"} P $UserDest :Si lo veo en el archivo\n");
  5.     }
  6.     else {
  7.         screen("$BOTS{\"admin\"} P $UserDest :No lo veo en el archivo\n");
  8.     }
  9. }
  10.  
  11. sub do_bdd {
  12.     my $lines     = &GetLines("system/database/admins/listado.txt");
  13.     my $busca_bdd = shift;
  14.     my $lines_;
  15.     open( BD, "system/database/admins/listado.txt" );
  16.     while ( $dest = <BD> ) {
  17.         chop($dest);
  18.         my @array = split( /:/, $dest );
  19.         if ( $busca_bdd eq $array[0] ) {
  20.             return 1;
  21.         }
  22.     }
  23.     close(BD);
  24.  
  25. }
  26.  
  27. sub GetLines {
  28.     my $ARCH = shift;
  29.     my $lim;
  30.     open( DATA, $ARCH );
  31.     while (<DATA>) {
  32.         $lim++;
  33.     }
  34.     close(DATA);
  35.     return ($lim);
  36. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Pero tampoco funciona.
Última edición por explorer el 2013-07-06 09:16 @428, editado 2 veces en total
Razón: Formateado de código con perltidy
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Base de datos en texto

Notapor explorer » 2013-07-06 09:15 @427

Pues a mí, sí que me funciona:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. my $DATABASE = '/etc/passwd';
  4.  
  5. $lectura[4] = 'explorer';
  6.  
  7. do_busca();
  8.  
  9. sub screen {
  10.     print shift;
  11. }
  12.  
  13. sub do_busca {
  14.     my $dato_a_buscar = lc( $lectura[4] );
  15.  
  16.     if ( do_bdd($dato_a_buscar) ) {
  17.         screen(qq($BOTS{"admin"} P $UserDest :Si lo veo en el archivo\n));
  18.     }
  19.     else {
  20.         screen(qq($BOTS{"admin"} P $UserDest :No lo veo en el archivo\n));
  21.     }
  22. }
  23.  
  24. sub do_bdd {
  25.     my $lines     = &GetLines($DATABASE);
  26.     my $busca_bdd = shift;
  27.     my $lines_;
  28.     open( BD, $DATABASE );
  29.     while (my $dest = <BD> ) {
  30.         chomp $dest;
  31.  
  32.         my @array = split( /:/, $dest );
  33.         if ( $busca_bdd eq $array[0] ) {
  34.             return 1;
  35.         }
  36.     }
  37.     close(BD);
  38.  
  39.     return;
  40. }
  41.  
  42. sub GetLines {
  43.     my $ARCH = shift;
  44.     my $lim;
  45.     open( DATA, $ARCH );
  46.     while (<DATA>) {
  47.         $lim++;
  48.     }
  49.     close(DATA);
  50.     return ($lim);
  51. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Aunque... el código se puede simplificar bastante.

Por ejemplo, ¿para qué quieres saber el número de líneas? En la mayor parte de los casos, no te ha falta ese dato.

Hecha un vistazo a Tie::File. Puede ahorrarte muchas líneas de código.
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

Re: Base de datos en texto

Notapor primitivo » 2013-07-06 10:40 @486

Gracias por tus consejos, explorer.

Las líneas, las necesito para comprobar el final del archivo y mandar una respuesta, la cual sería que se habría alcanzado la lectura y no se encontró el registro en el .txt
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Esta es la rutina que modifiqué
  2.  
  3. sub do_bdd {
  4.     my $lines     = &GetLines("system/database/admins/admins.txt");
  5.     my $busca_bdd = shift;
  6.     my $lines_;
  7.     open( BD, "system/database/admins/admins.txt" );
  8.     while ( $dest = <BD> ) {
  9.         $lines_++;
  10.         chop($dest);
  11.         my @array = split( /:/, $dest );
  12.         if ( $busca_bdd eq $array[0] ) {
  13.             return 1;
  14.         }
  15.         else {
  16.             if ( $lines_ >= $lines ) {
  17.                 return 0;
  18.             }
  19.         }
  20.     }
  21.     close(BD);
  22. }
  23.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Base de datos en texto

Notapor explorer » 2013-07-06 12:04 @544

Pues no... no lo necesitas...

Te basta con devolver el fallo en caso de llegar al final del archivo y no encontrar lo que buscas:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub do_bdd {
  2.     my $busca_bdd = shift;
  3.  
  4.     open(my $BD, "system/database/admins/admins.txt" );    # abrimos el archivo con un gestor de archivos local,
  5.                                                            # para que cierre el archivo cuando salga del contexto
  6.     while (my $dest = <$BD> ) {                            # mientras tengamos registros que leer...
  7.         chomp $dest;
  8.  
  9.         my $campo0 = (split( /:/, $dest))[0];              # primer campo del registro
  10.  
  11.         if ($busca_bdd eq $campo0) {                       # si es lo que buscamos
  12.             return $dest;                                  # salimos con un valor positivo: el propio registro encontrado
  13.         }
  14.     }
  15.  
  16.     close $BD;                                             # hemos llegado al fin del archivo
  17.  
  18.     return;                                                # y no lo hemos encontrado
  19. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Es importante el uso de $BD y no de BD. Si no lo hacemos, en caso de encontrar lo que buscamos, no se ejecutaría el close(), quedando el archivo abierto.

En cambio, usando $BD, en caso de salir de la subrutina con el return que está en mitad del bucle, Perl cerraría de forma automática el archivo abierto (ejecutaría un close $BD de forma automática), liberando los recursos ocupados en esa gestión.

El valor de retorno de la subrutina es un "falso" si no encuentra nada, y un registro completo de la base de datos, si sí es encontrado.

De esta manera, al llamar a la subrutina, sabemos si existe o no un registro, y si existe, su contenido:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $registro = do_bdd("elemento a buscar");
  2. if ($registro) {
  3.     ...;                 # aquí procesamos el registro
  4. }
  5. else {
  6.     say "registro no encontrado";
  7. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
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

Re: Base de datos en texto

Notapor primitivo » 2013-07-06 14:28 @644

Sería lo ideal, pero no sé, porque solo lee la primera línea, únicamente... (Ya probé tu sugerencia, y va mejor que la mia).

Al final decidí lo siguiente.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. sub admin_database
  2. {
  3.     my $data = shift;
  4.     my $FILE_HANDLE = "system/database/admins/";
  5.     $FILE_HANDLE .= $data;
  6.     if (-e $FILE_HANDLE)
  7.     {
  8.            return 1;
  9.     } else {
  10.            return 0;
  11.     }
  12. }
  13.  
  14. sub do_svsj
  15. {
  16.     my $validate_user = $USUARIOS{$UserDest};
  17.     if (&admin_database("$validate_user") == 1)
  18.     {
  19.         my $force = lc($lectura[4]);
  20.         my $channel = lc($lectura[5]);
  21.        
  22.         $forced = $NUMERICOS{$force};
  23.         if ($forced)
  24.         {
  25.            print $socket "$numerico SVSJOIN $forced $channel\n";
  26.         } else {
  27.                screen("$numerico P $UserDest :No he podido encontrar el objetivo\n");
  28.         }
  29.     } else {
  30.            print $socket qq($numerico P $UserDest :Acceso denegado\n); #Se aprende del maestro.
  31.     }
  32. }
  33.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Lo malo de esta práctica, es que tengo que hacer 22 subrutinas.
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Re: Base de datos en texto

Notapor explorer » 2013-07-06 20:40 @903

¿a qué 22 subrutinas te refieres? ¿qué es lo que varía de una a la otra?
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

Re: Base de datos en texto

Notapor primitivo » 2013-07-07 10:21 @473

Lo que varía es el desde dónde se llama.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. # Por ejemplo, si llamo desde el programa 'admin'...
  2.  
  3. &admin_database("$validate_user");
  4.  
  5. # Pero si llamo desde el programa 'oper'...
  6.  
  7. &oper_database("$validate_user");
  8.  
  9. # Y así... son 22 programas que llevo al tiempo (integrados)
  10.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿me hago entender?
primitivo
Perlero nuevo
Perlero nuevo
 
Mensajes: 80
Registrado: 2013-03-22 23:05 @004

Siguiente

Volver a Básico

¿Quién está conectado?

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

cron