我正在进行用户登录,但是我遇到了用户创建部分的问题。我的问题是我正在尝试检查文本文件的输入用户名,看看该用户名是否已经存在。我似乎无法将输入用户名与我引入的数组进行比较。我尝试了两种不同的方法来实现这一点。一个使用数组,另一个使用我在网上阅读的东西,我不太明白。任何帮助或解释将不胜感激。
这是我尝试使用数组来比较 http://codepad.org/G7xmsf3z
这是我的第二次尝试 http://codepad.org/SbeqmdbG
答案 0 :(得分:2)
在第一次尝试时,尝试将if放在循环中:
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}) {
答案 1 :(得分:1)
如上所述,关于从其他进程锁定flatfile,也存在扩展问题。您拥有的用户越多,查找速度就越慢。
我几年前开始使用平面文件,相信我永远不会扩展到需要真正的数据库,并且不想学习如何使用mySQL。最终,在平面文件损坏和查找时间过长之后,我别无选择,只能转移到数据库。
稍后您会发现自己想要存储用户首选项,这样就可以轻松地向数据库添加新字段。 Flatfile最终会将每行拆分成单独的字段。
我建议您使用数据库正确完成。
答案 2 :(得分: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()是多年前完成的。