2012-02-11 29 views
5

Estoy trabajando en un inicio de sesión de usuario y tengo problemas con la parte de creación del usuario. Mi problema es que estoy tratando de verificar el nombre de usuario de entrada con un archivo de texto para ver si ese nombre de usuario ya existe. Parece que no puedo comparar el nombre de usuario de entrada con el conjunto que he traído. He intentado dos formas diferentes de lograr esto. Una usando una matriz y otra usando algo que leo en línea que no entiendo del todo. Cualquier ayuda o explicación sería muy apreciada.Problemas para comprobar la entrada del nombre de usuario contra el archivo plano para la creación del usuario

Aquí está mi intento de utilizar un conjunto para comparar fuera de http://codepad.org/G7xmsf3z

Aquí es mi segundo intento http://codepad.org/SbeqmdbG

+1

Cuando veo preguntas como esta, siempre pienso "¿Qué tan similar deberían ser los nombres de usuario?" Es decir. ¿Debería permitirse el nombre de usuario 'Ejemplo ', si' Ejemplo' está registrado? ¿O deberían 'emily' y' emily' estar permitidos? En resumen, decida las reglas primero, luego haga una subrutina, que siga esas reglas. – TLP

+1

Aquí tendrá una condición de carrera que arruinará su sistema de registro. Debe averiguar cómo bloquear otros procesos para que no actualicen su lista de cuentas hasta que su programa actual termine la ejecución y libere su bloqueo. Bloquear archivos es factible pero no tan fácil como almacenar la información en una base de datos adecuada que manejará el bloqueo para usted ... – tadmc

Respuesta

2

En su primer intento, tratar de poner el caso en el interior del bucle:

foreach my $pair(@incomingarray) { 
    (my $name,my $value) = split (/:/, $pair); 

    if ($name eq $username) { 
     print p("Username is already taken, try again"); 
     close(YYY); 
     print end_html(); 
    } 
    else { 
     open(YYY, ">>password.txt"); 
     print YYY $username.":".$hashpass."\n"; 
     print p("Your account has been created sucessfully"); 
    close(YYY); 
    print end_html(); 
    } 
} 

En su segundo intento, creo que debería intentar y cambiar la línea:

if (%users eq $username) { 

con éste:

if (defined $users{$username}) { 
0

Al igual que en mi comentario, no debería estar usando un flatfile para mantener su información de usuario. ¡Debería utilizar una base de datos adecuada que gestionará el acceso simultáneo para usted en lugar de tener que entender y codificar cómo manejar todo eso usted mismo!

Si usted insiste en el uso de una matriz, se puede buscar con grep() si no es "demasiado grande":

if (grep /^$username:/, @incomingarray) { 
    print "user name '$username' is already registered, try again\n"; 
} 
else { 
    print "user name '$username' is not already registered\n"; 
} 

veo algunos otros problemas en su código.

Siempre debe preferir las variables léxicas (mi) sobre las variables del paquete (nuestras). ¿Por qué crees (erróneamente) que $ name y $ username no pueden ser variables léxicas?

Siempre debe usar la forma 3-arg de abrir() y verificar su valor de retorno como en el ejemplo del segundo código. Tu open() en el primer ejemplo de código es cómo se hizo hace muchos años.

1

Como se ha indicado anteriormente respecto al bloqueo del archivo plano de otros procesos, también existe el problema de la reducción de escala. cuantos más usuarios tengas, más lenta será la búsqueda.

Comencé hace años con un archivo plano, creyendo que nunca escalaría lo suficiente como para requerir una base de datos real y no quería aprender a usar mySQL, por ejemplo. Finalmente, después de la corrupción de los archivos planos y los largos tiempos de búsqueda, no tuve más remedio que moverme a una base de datos.

Más adelante encontrará que desea almacenar las preferencias del usuario y, por lo tanto, es fácil agregar un nuevo campo a una base de datos. Flatfile terminará teniendo la sobrecarga de dividir cada línea en campos separados.

Le sugiero que lo haga correctamente con una base de datos.

+0

todo esto se hace por el bien de aprender, también se conectará a una base de datos. Eso es lo que trataré de lograr la próxima semana con esto, pero por ahora solo intento que el archivo plano funcione. – Jared

+0

Incluso una base de datos [NoSQL] (http://en.wikipedia.org/wiki/NoSQL) sería mejor que un archivo plano. –

Cuestiones relacionadas