通过一个实例简单了解perl

这是一个用户管理的小软件。需要输入正确的密码才能进入系统,密码通过.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
================= ========= ==========
.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值