2012-02-11 7 views
5

Sto lavorando ad un accesso utente e sto avendo problemi con la parte di creazione dell'utente. Il mio problema è che sto cercando di verificare il nome utente di input su un file di testo per vedere se quel nome utente esiste già. Non riesco a convincerlo a confrontare il nome utente dell'input con l'array che ho introdotto. Ho provato due diversi modi per ottenere questo risultato. Uno usa un array e un altro usando qualcosa che ho letto online che non capisco. Qualsiasi aiuto o spiegazione sarebbe molto apprezzato.Problemi di controllo dell'input del nome utente rispetto al file flat per la creazione dell'utente

Qui è il mio tentativo di utilizzare un array per confrontare off di http://codepad.org/G7xmsf3z

Ecco il mio secondo tentativo http://codepad.org/SbeqmdbG

+1

Quando vedo domande come questa, penso sempre "Quanto dovrebbe essere consentito che i nomi utente siano?" Cioè Dovrebbe essere permesso il nome utente "Esempio", se "Esempio" è registrato? Oppure dovrebbero essere "emily" e "emily" entrambi ammessi? In breve, decidi prima le regole, poi crea una subroutine per esso, che segue quelle regole. – TLP

+1

Qui troverai una condizione di gara che rovinerà il tuo sistema di registrazione. È necessario capire come bloccare altri processi dall'aggiornamento dell'elenco di account fino a quando il programma corrente non ha terminato l'esecuzione e rilasciato il blocco. Bloccare i file è fattibile ma non è così facile come archiviare le informazioni in un DB appropriato che gestirà il blocco per voi ... – tadmc

risposta

2

Nel primo tentativo, cercare di mettere il caso all'interno del ciclo:

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(); 
    } 
} 

Nel secondo tentativo, penso che dovresti provare a cambiare linea:

if (%users eq $username) { 

con questo:

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

Come nel mio commento, non si deve fare uso di un flatfile per tenere le tue informazioni utente. Dovresti utilizzare un database appropriato che gestirà l'accesso simultaneo per te piuttosto che dover capire e programmare come gestire tutto questo da solo!

Se ti ostini a usare un array, è possibile cercare con grep() se non è "troppo 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"; 
} 

vedo alcuni altri problemi nel codice pure.

Si dovrebbe sempre preferire le variabili lessicali (mie) sulle variabili del pacchetto (le nostre). Perché pensi (erroneamente) che $ name e $ username non possano essere variabili lessicali?

Si dovrebbe sempre usare il modulo 3-arg di open() e controllare il suo valore di ritorno come nell'esempio del secondo codice. Il tuo open() nel primo esempio di codice è come è stato fatto molti anni fa.

1

Come è stato detto sopra per quanto riguarda il blocco del flatfile da altri processi, vi è anche il problema del ridimensionamento. più utenti hai il più lento sarà la ricerca.

Ho iniziato anni fa con un file flat, credendo che non avrei mai scalato abbastanza da richiedere un vero database e non volevo imparare come usare mySQL per esempio. Alla fine, dopo corruzioni flatfile e lunghi tempi di ricerca, non ho avuto altra scelta che passare a un database.

In seguito ci si ritroverà a voler memorizzare le preferenze dell'utente e, ad esempio, è facile aggiungere un nuovo campo a un database. Flatfile finirà per avere l'overhead di dividere ogni riga in campi separati.

Suggerirei di farlo correttamente con un database.

+0

tutto questo viene fatto per motivi di apprendimento, sarà collegato anche a un database. Questo è quello che cercherò di realizzare la prossima settimana con questo, ma per ora sto solo cercando di far funzionare il file flat. – Jared

+0

Anche un database [NoSQL] (http://en.wikipedia.org/wiki/NoSQL) sarebbe migliore di un file flat. –

Problemi correlati