2012-02-11 25 views
5

我正在处理用户登录,并且在用户创建部分遇到问题。我的问题是,我试图检查输入的用户名和文本文件,看看用户名是否已经存在。我似乎无法得到它比较输入的用户名和我带入的数组。我尝试了两种不同的方式来完成此操作。一个使用数组,另一个使用我在网上阅读的东西,我不太明白。任何帮助或解释将不胜感激。问题检查用户输入与用户创建的平面文件

下面是一个使用数组我试图比较关闭的 http://codepad.org/G7xmsf3z

这里是我的第二次尝试 http://codepad.org/SbeqmdbG

+1

当我看到这样的问题时,我总是会想:“用户名应该有多类似?”即如果允许用户名'EXample',如果'Example'被注册?还是应该'emily'和'emily''都允许?总之,先决定规则,然后为它制定一个子程序,遵循这些规则。 – TLP 2012-02-11 19:37:29

+1

在这里你会遇到一个混乱注册系统的竞争条件。您必须弄清楚如何锁定其他进程以更新您的账户列表,直到您的当前程序完成执行并释放其锁定。锁定文件是可行的,但不如将信息存储在适当的数据库中,以便为您处理锁定... – tadmc 2012-02-11 20:32:21

回答

2

在你的第一次尝试,尝试,如果环路内放:

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

在你第二次尝试,我认为你应该尝试改变线:

if (%users eq $username) { 

这一个:

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

正如我的评论,你不应该使用平面文件来保存用户信息。你应该使用一个合适的数据库来为你处理并发访问,而不必理解和编写如何处理所有这些问题!

如果你坚持要用一个数组,你可以使用grep(),如果它不是“过大”搜索一下:

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

我看到你的代码中的一些其他的问题。

你应该总是喜欢词法(我)变量超过包(我们)的变量。 为什么你认为(错误地)$ name和$ username不能是词法变量?

你应该总是使用open()的3-arg形式,并检查它的返回值,就像在第二个代码示例中一样。第一个代码示例中的open()是很多年前的做法。

1

如上所述,有关从其他进程锁定平面文件的问题,也存在缩放问题。您查询的速度越慢,用户越多。

我几年前开始使用一个平面文件,相信我永远不会扩展到需要真正的数据库,也不想学习如何使用mySQL。最终在平面文件损坏和长时间查找后,我别无选择,只能移动到数据库。

稍后,您会发现自己希望存储用户首选项,并且很容易将新的字段添加到数据库。 Flatfile最终会将每行分割成单独的字段。

我建议你用数据库正确地做。

+0

这是为了学习而完成的,它也将被连接到数据库。这就是我将在下周试图完成的事情,但现在我只是试图让平面文件工作。 – Jared 2012-02-11 22:35:08

+0

即使[NoSQL](http://en.wikipedia.org/wiki/NoSQL)数据库也会比平面文件更好。 – 2012-02-14 05:49:02