问题检查用于创建用户的平面文件的用户输入

时间:2012-02-11 17:44:08

标签: perl

我正在进行用户登录,但是我遇到了用户创建部分的问题。我的问题是我正在尝试检查文本文件的输入用户名,看看该用户名是否已经存在。我似乎无法将输入用户名与我引入的数组进行比较。我尝试了两种不同的方法来实现这一点。一个使用数组,另一个使用我在网上阅读的东西,我不太明白。任何帮助或解释将不胜感激。

这是我尝试使用数组来比较 http://codepad.org/G7xmsf3z

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

3 个答案:

答案 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()是多年前完成的。