我正在处理用户登录,并且在用户创建部分遇到问题。我的问题是,我试图检查输入的用户名和文本文件,看看用户名是否已经存在。我似乎无法得到它比较输入的用户名和我带入的数组。我尝试了两种不同的方式来完成此操作。一个使用数组,另一个使用我在网上阅读的东西,我不太明白。任何帮助或解释将不胜感激。问题检查用户输入与用户创建的平面文件
下面是一个使用数组我试图比较关闭的 http://codepad.org/G7xmsf3z
这里是我的第二次尝试 http://codepad.org/SbeqmdbG
我正在处理用户登录,并且在用户创建部分遇到问题。我的问题是,我试图检查输入的用户名和文本文件,看看用户名是否已经存在。我似乎无法得到它比较输入的用户名和我带入的数组。我尝试了两种不同的方式来完成此操作。一个使用数组,另一个使用我在网上阅读的东西,我不太明白。任何帮助或解释将不胜感激。问题检查用户输入与用户创建的平面文件
下面是一个使用数组我试图比较关闭的 http://codepad.org/G7xmsf3z
这里是我的第二次尝试 http://codepad.org/SbeqmdbG
在你的第一次尝试,尝试,如果环路内放:
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}) {
正如我的评论,你不应该使用平面文件来保存用户信息。你应该使用一个合适的数据库来为你处理并发访问,而不必理解和编写如何处理所有这些问题!
如果你坚持要用一个数组,你可以使用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()是很多年前的做法。
如上所述,有关从其他进程锁定平面文件的问题,也存在缩放问题。您查询的速度越慢,用户越多。
我几年前开始使用一个平面文件,相信我永远不会扩展到需要真正的数据库,也不想学习如何使用mySQL。最终在平面文件损坏和长时间查找后,我别无选择,只能移动到数据库。
稍后,您会发现自己希望存储用户首选项,并且很容易将新的字段添加到数据库。 Flatfile最终会将每行分割成单独的字段。
我建议你用数据库正确地做。
这是为了学习而完成的,它也将被连接到数据库。这就是我将在下周试图完成的事情,但现在我只是试图让平面文件工作。 – Jared 2012-02-11 22:35:08
即使[NoSQL](http://en.wikipedia.org/wiki/NoSQL)数据库也会比平面文件更好。 – 2012-02-14 05:49:02
当我看到这样的问题时,我总是会想:“用户名应该有多类似?”即如果允许用户名'EXample',如果'Example'被注册?还是应该'emily'和'emily''都允许?总之,先决定规则,然后为它制定一个子程序,遵循这些规则。 – TLP 2012-02-11 19:37:29
在这里你会遇到一个混乱注册系统的竞争条件。您必须弄清楚如何锁定其他进程以更新您的账户列表,直到您的当前程序完成执行并释放其锁定。锁定文件是可行的,但不如将信息存储在适当的数据库中,以便为您处理锁定... – tadmc 2012-02-11 20:32:21