尝试使用perl脚本在数据库中存储用户的上次登录时间

尝试使用perl脚本在数据库中存储用户的上次登录时间,perl,Perl,我编写了一段代码,试图使用perl脚本存储用户的上次登录时间,并使用dbmopen将其存储在哈希中,但它无法获取更新的登录时间:- 我的守则如下: #!/usr/bin/perl -w use DB_File; use Time::localtime; %last_good =(); %words = () ; init_words(); print " What is your name ? \n"; $name=<STDIN>; chomp($name); print "Hi

我编写了一段代码,试图使用perl脚本存储用户的上次登录时间,并使用dbmopen将其存储在哈希中,但它无法获取更新的登录时间:- 我的守则如下:

#!/usr/bin/perl -w
use DB_File;
use Time::localtime;
%last_good =();
%words = () ;
init_words();
print " What is your name ? \n";
$name=<STDIN>;
chomp($name);
 print "Hi $name , please Enter your secret password: \n" ;
 $passwd = <STDIN>;
 chomp($passwd);
 $i=1;
 while(! good_password($name,$passwd))
 {
  print " Wrong Password , Please Try Again : \n";
  $passwd=<STDIN>;
  chomp($passwd);
 }
print "assigning the last login time \n ";
dbmopen (%last_good,"lastdb",0777) || die "can't dbmopen lastdb: $!";
$last_good{$name} = localtime;   // update last login time if password correct
dbmclose (%last_good) || die "can't dbmclose lastdb: $!";
print "the last login time for :  $name is $last_good{$name} ";

sub init_words
{
 open(WORDLIST,"password.txt") || die " Can not Read the password.txt : $! \n";
 while(defined ($name = <WORDLIST>))
 {
  chomp($name);
  $name =~ s/\W.*// ;
  $name =~ tr /A-Z/a-z/ ;
  $password=<WORDLIST>;
  chomp($password);
  $words{$name}=$password;
  if(! defined $last_good{$name} )
  {
    dbmopen (%last_good,"lastdb",0777) || die "can't dbmopen lastdb: $!";
    $last_good{$name} = localtime;   // update login time for 1st login
    dbmclose (%last_good) || die "can't dbmclose lastdb: $!"; 
  }
  write;
 }
 close(WORDLIST) || die " Could not close the file : $! \n ";
}
#/usr/bin/perl-w
使用DB_文件;
使用时间::localtime;
%last_good=();
%单词=();
初始单词();
打印“你叫什么名字?\n”;
$name=;
chomp($name);
打印“Hi$name,请输入您的密码:\n”;
$passwd=;
chomp($passwd);
$i=1;
而(!好的密码($name,$passwd))
{
打印“密码错误,请重试:\n”;
$passwd=;
chomp($passwd);
}
打印“分配上次登录时间\n”;
dbmopen(%last_good,“lastdb”,0777)| | die“无法打开lastdb:$!”;
$last_good{$name}=localtime;//如果密码正确,则更新上次登录时间
dbmclose(%last_good)| die“无法关闭lastdb:$!”;
打印“上次登录时间:$name为$last_good{$name}”;
亚初始词
{
打开(WORDLIST,“password.txt”)| | die“无法读取密码。txt:$!\n”;
while(已定义($name=))
{
chomp($name);
$name=~s/\W.*/;
$name=~tr/A-Z/A-Z/;
$password=;
chomp($password);
$words{$name}=$password;
如果(!defined$last_good{$name})
{
dbmopen(%last_good,“lastdb”,0777)| | die“无法打开lastdb:$!”;
$last_good{$name}=localtime;//更新第一次登录的登录时间
dbmclose(%last_good)| die“无法关闭lastdb:$!”;
}
写
}
close(WORDLIST)| | die“无法关闭文件:$!\n”;
}
我想做的是在第一次登录时更新或放入数据库,如果不是他们的
使用
if(!defined$last\u good{$name})
,如果在第二次运行程序时已经定义了它,我希望它从数据库中重新读取,而不是尝试再次创建它。但是当我尝试打印
$last\u good{$name}=localtime
在第一次分配后,它不会打印登录名
localtime
,但它表示登录名未定义。

我认为这只是您在尝试打印值之前调用了
dbmclose
。所以当然散列被解开了。

是不是
好的密码
也使
$name
小写?另外,我不明白您试图用
$name=~s/\W.*/
实现什么。尝试使用类似于
Data::Dumper
的内容转储
%last\u good
,以验证它是否与您期望的一样。