El '1' que obtienes, es el del close() de la línea 39.
En Perl, el resultado de una función siempre es el de la última sentencia ejecutada dentro de esa función, salvo cuando usamos un return().
En tu caso, la condición de la línea 34 nunca se cumple: has intentado poner una expresión regular para comparar si el $valor que estamos buscando coincide con el primer campo de la línea, pero se te ha olvidado poner los delimitadores al patrón $aa[0]. Debería ser
if ($valor =~ /$aa[0]/).
Pero... no es eso lo que necesitas. Estás queriendo buscando coincidencias plenas. Debes usar el operador de igualdad de cadenas de caracteres 'eq' para saber si el $valor es igual a $aa[0].
Hay otros detalles en el código, que quiero comentarte. El código, más reducido, queda así:
Using perl Syntax Highlighting
if (database('nicks', 'nicks.db', $nickR)) {
screen(qq($BOTS{"nick"} P $UserDest :Ese nick ya se encuentra registrado, Por favor escoja otro.\n));
screen(qq($BOTS{"nick"} P $UserDest :Por ejemplo '$nickR$options'\n));
}
else {
make_nick($nickR, 'nicks.db', 'nicks');
}
sub make_nick {
my ($regadd, $data, $dir) = @_;
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) = localtime(time);
$year += 1900;
$mon++;
# Creando el registro del usuario
insert_data($regadd, $data, $dir, "$mday/$mon/$year", "$hour:$min:$sec", $mail, 'REGISTRADO', $IPS{$UserDest});
}
sub database {
my ($dir, $data, $valor) = @_;
open(my $DATA, "<system/database/$dir/$data");
while (my $a = <$DATA>) {
chomp $a;
my @aa = split(/:/, $a);
if ( $valor eq $aa[0] ) {
print "$aa[0] -> $a\n";
return 1;
}
}
close($DATA);
return 0;
}
sub insert_data {
my ( $first, $second, $third, $Month, $Hour, $Mails, $State, $Ipc ) = @_;
open( datatt, ">>system/database/$third/$second" );
print datatt "$first:$Month:$Hour:$Mails:$State:$Ipc\r\n";
close(datatt);
}
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
Estos son los cambios fundamentales:
- no es necesario poner una variable entre comillas dobles si entre las comillas dobles no hay nada más que esa variable. Por ejemplo, tu pones "$nickR" en la primera línea, cuando realmente no se necesitan las comillas. Ponerlas, hace tu programa más lento de ejecutar, y más largo de escribir
- para recuperar los argumentos pasados a una función, usamos normalmente el shift(), que lo que hace es sacar los argumentos desde el array especial @_. El caso es que para uno o dos argumentos está bien, pero, para el caso de insert_data(), repetir shift ocho veces... pues es muy cansado. Mejor es asignar @_ a la lista de variables locales indicadas por my(), como ves en mi versión
- no es necesario llamar a las subrutinas con el sigilo '&' delante de ellas. Por favor: nuestro lenguaje es lo suficientemente peludo como para encima ponerle más pelo (modismo inglés)
- no entiendo por qué usas el operador or-lógico '||' para componer la fecha y la hora. He considerado que es más lógico usar comillas dobles para componer los dos valores
- hay variables que sobran porque nunca son conocidas fuera de su contexto de definición: $co y $passwd. En la primera parte, en la línea 4, imprimes el valor de $aa[0], pero resulta que ese array es local a la función database(), así que cuando sales de la función, @aa ya ha desaparecido, por lo que no puedes saber el valor de $aa[0]. Estos errores te los puede avisar Perl, antes, si usases 'use strict;' al principio del programa
- el gestor de archivo se transforma en $DATA, una variable local, por una razón: en caso de que la subrutina saliese por el return del interior del bucle, no se ejecutaría el close() del final, por lo que quedaría el archivo abierto. No es importante, pero si tu programa va a estar mucho tiempo funcionando, eso se transforma en un recurso ocupado en la memoria y del propio sistema operativo (cachés y búferes ocupados), y esos tienen un determinado límite. Si se llega al límite, el programa puede llegar a ser parado. Al ponerlo en forma de variable local, garantizamos que, al salir de la subrutina, el archivo siempre es cerrado. Otra forma más cómoda de hacerlo:
Using perl Syntax Highlighting
my $encontrado = 0;
open(my $DATA, "<system/database/$dir/$data");
while (<$DATA>) { # la línea se guarda en $_
# no es necesario el chomp, porque solo nos interesa el primer campo
my $campo1 = (split /:/)[0]; # el split() nos devuelve una lista de elementos, y solo nos quedamos con el primero
if ( $valor eq $campo1 ) { # si es el que buscamos...
print "$_\n"; # informamos
$encontrado = 1; # marcamos la bandera
last; # y terminamos el bucle
}
}
close($DATA);
return $encontrado;
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
- en la línea 47 tienes puesto un "\r\n", lo cual... es curioso... ¿no querrás usar solo un "\n"? El usar "\r\n" es solo para el caso de que quieras guardar tu base de datos para formato MSDOS/Windows. Te podría dar problemas en otros sistemas. Recuerda que cuando pones "\n", Perl usará el carácter o caracteres de nueva línea del sistema operativo en que te encuentres.