这是一个用户管理的小软件。需要输入正确的密码才能进入系统,密码通过.secret文件保存,将用户输入错误的密码通过dbm文件保存到本地,并且通过mail通知管理员
#!/usr/bin/perl-w
#-w表示-w转换器,要求perl对潜在的危险构建产生附加报警信息
@words = ("hello","your","ss");#@开头表示数组
@another_words = qw(this is password);#qw函数用来为每个字符串加上引号
init_password();#创建哈希表,使用关键字%
print("Hey!My reader!\n");
print("What's your name?\n");
$name = <STDIN>;#<STDIN>捕获一行输入
chomp($name);#除掉尾部的换行符
print("Hi,$name\n");
#正则表达式用斜杠/来分界,在斜杠后边加入i,表示不区别大小写,\b表示单词边界,这样就不能匹配到ass这样的单词
if ($name =~ /^SS\b/i) {
#eq是Equate的缩写,是等于,比较两个字符串
print("Hi,SS!How are you?\n");
} else {
print("Hello,$name\n");
print("What is the password?\n");
$guess_password = <STDIN>;
chomp($guess_password);
while (!good_word($name, $guess_password)) {#ne是not equate的缩写,表示不相等
print "wrong password,try again.\n";
print "What's your password?\n";
$guess_password = <STDIN>;
chomp($guess_password);
}
print "Welcome to the system!\n";
}
dbmopen(%last_password, "lastdb", 0666);#0666的访问模式,意味任何人都能读写这个文件
$last_password{$name} = time;
dbmclose(%last_password);
sub good_word {#子程序(例程)
my($somename, $someguess) = @_;#子函数的参数放在局部数组@_中
#s表示substitute提取name中的内容,找到第一个非单词字符,将他到字符串之间的内容删除,
#\w代表非单词字符,.*代表任何字符串
#因为取代的字符串是空串,所以第二个第三斜杠之间没有内容,
$somename =~ s/\W.*//;
#~和s之间要有空格
#将name中的大写字母变成小写,A-Z代表26个大写字母
$somename =~ tr/A-Z/a-z/;
if ($somename eq "ss") {
return 1;#return true;
#输入密码,哈希前面用$不要用%,如果名字没有查到,返回一个空字符串
} elsif (($hash_words{$somename}||"fake ss")eq $someguess) {#||表示或,如果从哈希表中没查到,用“fake ss”代替
return 1;
} else {
#open的第二个参数前有个|表示管道符,表示打开的不是文件而是一个命令
open MAIL,"|mail 1234\@qq.com";
#mail作为命令输入
print MAIL "bad news:$somename guessed $someguess\n";
close MAIL;
return 0;#return false;
}
}
sub init_password{
while ($filename = <*.secret>) {
#open函数初始化文件句柄PASSWORDLIST,和当前目录下的passwordlist文件关联起来,
#文件句柄通常使用大写,open失败时,die使用stderr输出错误信息,$!包含系统的错误信息
open(PASSWORDLIST, $filename)||die "can't open this file:$!";
#-M操作返回上一次文件被修改以来的天数
if (-M PASSWORDLIST < 7.0) {
#使用while读取文件,每次都去一行,当文件结束时返回空串
#defined函数检查读取文件的这一行是否已定义
while (defined($name = <PASSWORDLIST>)) {
chomp($name);
$password = <PASSWORDLIST>;
chomp($password);
$hash_words{$name} = $password;#write函数引用格式
}
}else{
#rename函数用来改名,第一个参数文件名改为第二个参数
rename($filename, "$filename.old")||die "can't rename $filename to $filename.old:$!";
}
close(PASSWORDLIST)||die "couldn't close this file:$!";
}
}
format STDOUT =
@<<<<<<<<<<<<<<<<@<<<<<<<<<@<<<<<<<<<# @是下面参数的占位符
$filename, $name, $password
.
format STDOUT_TOP =#第一次引用STDOUT格式时使用,$%用于打印页数
Page @<<
$%
Filename Name password
================= ========= ==========
.