Hola, he estado probando las rutinas del tutorial de base de datos para manejo de texto y tengo las siguientes preguntas:
1. Se creó una librería llamada txtdb_lib.pl, la llamé de un programa con use txtdb_lib.pl, y me marcó error. Lo que hice fue incluir todo el código en mi programa principal, pero ¿cómo la llamo?
2. Para probar todas las rutinas generé el archivo base_datos.txt con el siguiente contenido:
id||nombre||no1||apellido||no5||email
1||esteban||1||quintana||2||[email protected]
2||uriel||3||lizama||4||[email protected]
3||hector||5||gutierrez||6||[email protected]
4||reynaldo||7||gutierrez||8||[email protected]
5||marco||9||zenil||10||[email protected]
6||miriam||11||sanchez||12||[email protected]
7||lula||3||gutierrez||4||[email protected]
3. Ejecuté el programa Borra registro txt.pl que tiene el siguiente código:
#!/usr/bin/perl
#------------ Prueba del manejo de archivos TXT BORRADO
#------------ &delete('base_datos.txt',5);
#------------ my @recordset = &selects_by_2_numbers('base_datos.txt',2,3,4,4);
my @data = ('ramon||6||hernandez||7||[email protected]');
&insert( 'base_datos.txt', @data );
#----- while(@recordset){
#----- print "$recordset[0] $recordset[1] $recordset[2] $recordset[3] $recordset[4] $recordset[5]\n";
#----- }
#------------ Rutina que borra registros por su ID
#------------ lOS PARAMETROS SON 2 EL ARCIVO.TXT Y EL NÚMERO A BORRAR
sub delete {
my ( @registros, @new_registros );
open( DATABASE, "<$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
close(DATABASE) || &error( 'cerrar', 'archivo' );
foreach $registro (@registros) {
#----- print "$registros\n";
$registro =~ s/\n//g;
my ( $id, @basura ) = split( /\|\|/, $registro );
if ( $id != $_[1] ) {
push( @new_registros, $registro );
#--------- print "$registros\n";
}
}
open( DATABASE, ">$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 2 ) || &error( 'lock', 'file' );
foreach $new_registro (@new_registros) {
print DATABASE "$new_registro\n";
}
close(DATABASE) || &error( 'cerrar', 'archivo' );
}
#-------------- Esta rutina abre la base de datos
sub open_db {
my (@registros);
open( DATABASE, "<$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
print "$registros\n";
close(DATABASE) || &error( 'cerrar', 'archivo' );
shift(@registros);
print "$registros\n";
return (@registros);
}
#-------------------- esta rutina selecciona por su número de registro
sub select_by_number {
my ($i, @registros, $registro,
@recordset, %return_recordset, $registro_cero,
@nombres, $cant_reg, $cant_reg_cero
);
open( DATABASE, "<$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
close(DATABASE) || &error( 'cerrar', 'archivo' );
$registro_cero = shift(@registros);
#----------- print "$registro_cero\n";
$registro_cero =~ s/\n//g;
#----------- print "$registro_cero\n";
@nombres = split( /\|\|/, $registro_cero );
$cant_reg_cero = @nombres;
#----------- print "$cant_reg_cero\n";
foreach $registro (@registros) {
$registro =~ s/\n//g;
@recordset = split( /\|\|/, $registro );
if ( $recordset[ $_[1] ] == $_[2] ) {
$cant_reg = @recordset;
if ( $cant_reg != $cant_reg_cero ) {
&error( 'procces',
'database- no coinciden las cantidades de registros' );
}
while ( $i < $cant_reg ) {
$return_recordset{ $nombres[$i] } = $recordset[$i];
$i++;
}
last;
}
}
return (%return_recordset);
}
#----------------------- Inserta registros
sub insert {
my ( $urldb, @data, @registros, $ultimo_registro, $id, @basura,
$new_registro );
( $urldb, @data ) = @_;
open( DATABASE, "<$urldb" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
close(DATABASE) || &error( 'cerrar', 'archivo' );
$ultimo_registro = @registros;
$ultimo_registro = $ultimo_registro - 1;
( $id, @basura ) = split( /\|\|/, $registros[$ultimo_registro] );
$id++;
$new_registro = $id;
foreach $data (@data) {
$data =~ s/\n//g;
$new_registro .= "||$data";
}
open( DATABASE, ">>$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 2 ) || &error( 'lock', 'file' );
print DATABASE "$new_registro\n";
close(DATABASE) || &error( 'cerrar', 'archivo' );
}
#------------ Rutina que selecciona registros por 2 criterios
sub selects_by_2_numbers {
my ( @registros, $registro, @recordset, @return_recordset );
open( DATABASE, "<$_[0]" ) || &error( 'abrir', 'archivo' );
flock( DATABASE, 1 ) || &error( 'lock', 'file' );
@registros = <DATABASE>;
close(DATABASE) || &error( 'cerrar', 'archivo' );
shift(@registros);
foreach $registro (@registros) {
@recordset = split( /\|\|/, $registro );
if ( $recordset[ $_[1] ] == $_[2] and $recordset[ $_[3] ] == $_[4] ) {
push( @return_recordset, $registro );
}
}
return (@return_recordset);
}
Le doy de argumento &delete('base_datos.txt',5);
Lo ejecuta y, en efecto, borra, pero me despliega el mensaje
Argument “id” isn´t numeric in numeric ne (!=) at line 27 que contiene: if ($id != $_[1]){ ¿porqué?.
Adicionalmente, en el foreach() se hace mención a $registro y en ninguna parte se declaró, o ¿cómo funciona?
Ejecuté la rutina de:
my @recordset = &selects_by_2_numbers('base_datos.txt',2,3,4,4);
usando el mismo archivo. ¿Cómo sé cuántos registros cumplen la condición y cómo los puedo presentar en pantalla? Lo que hice fue:
while(@recordset){
print "$recordset[0] $recordset[1] $recordset[2] $recordset[3] $recordset[4] $recordset[5]\n";
}
Y no funcionó, ¿Cómo lo hago?
Finalmente la rutina de insert trabajó muy bien.
Notas: En el programa están comentadas las líneas del delete y del
my @recordset = &selects_by_2_numbers('base_datos.txt',2,3,4,4);