Discuz的passport与Perl版本的passpost[通用](1 位领导批示)
最近做的一个项目中 需要perl与php进行数据通信.我用LWP::UserAgent的POST方法实现了与PHP程序的连接.
不过在安全上有很大问题.找了找.DZ的passport就直接拿来用了..哇卡卡..
首先是Discuz的passport方法
最近做的一个项目中 需要perl与php进行数据通信.我用LWP::UserAgent的POST方法实现了与PHP程序的连接.
不过在安全上有很大问题.找了找.DZ的passport就直接拿来用了..哇卡卡..
首先是Discuz的passport方法
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #!/usr/bin/perl #--------------------------------------------------------- use strict; my $dir = "dirname/"; opendir DH, $dir or die "cannot chdir to $dir : $!"; for my $file (readdir DH) { ($file eq '.') and next; ($file eq '..') and next; if (time() - (stat($dir.$file))[9] > (60*60)) { unlink $dir.$file; } print $dir.$file."\n"; } closedir DH; |
然后创建一个计划任务进行处理.
这个代码中会将一小时前创建的文件删除.
时间可以进行修改 (60*60) 单位:秒
原贴地址:http://bbs.blueidea.com/thread-2881919-1-1.html
题目:首先把你的生日列出来 比如 1987 12 25
然后一位位的相加 1+9+8+7+1+2+2+5=35
把得出的数字再拆分 再加 3+5=8
最后向屏幕输出:8
19871225可看作字符型也可以看作整型,想怎么看就怎么看,不限。
我用perl写了一个函数..思路与其它人用js.vbs.php的思路类似.
Perl被设计成90%擅长处理文本,10%处理其余的问题。因此Perl有强大的文本处理能力,包括正则表达式。但有时正则表达式过于复杂,需要一种更简单的方法来处理字符串。
一、使用索引寻找子串
查找的方法依赖于查找的地方。如果在一个大字符串中查找,可以使用index函数。
Perl查找子串第一次在大字符串中出现的地方,返回第一个字符的位置。字符位置是从0开始编号的。如果子串在字符串的开头处找到,则index返回0。如果一个字符后,则返回1,依次类推。如果子串不存在,则返回-1。
index函数总是报告子串出现的第一个位置。可以使用可选的第三个参数要求它从后面的某个地方开始查询,它会告诉index从什么位置开始。
NOTE:通常不能重复的查找某个子串,除非使用了循环。
如果想知道某个子串最后出现的位置。可以使用rindex 函数来做到。
rindex函数也有可选的第三个参数,它给出的是可能的最大值。
一、在目录树上移动
程序在某个工作目录(working directory)下运行,这是相对路径的起点。
chdir可以改变工作目录。它和Unix shell,Win command下的cd命令类似。
chdir "/test" or die "打开目录出错:$!";
错误发生时将给变量$!赋值。通常应当检查$!的值,因为它将告诉你chdir失败的原因。
工作目录会被Perl启动后的所有进程所继承。但是对于调用Perl的进程的工作目录将不会改变,因此,不能写一个Perl程序来代替shell下的cd命令。
二、Globbing
通常,shell将每个命令行中的任何的文件名模式转换成它所匹配的文件名。这被称作globbing。例如,在echo命令后使用了文件名模式*.pm,shell会将它转换成它所匹配的文件名。
my @all_files = glob "*";
foreach $v (@all_files)
{
print $v."\n";
}
@all_files得到了当前目录下的所有文件,这些文件按照字母排序的,不包括由点(.)开头的文件。
my @all_files = glob ".* *";
foreach $v (@all_files)
{
print $v."\n";
}
这里,我们包括了额外的 点星号(.*) 参数,来得到所有的文件(由点开头的文件,以及不由点开头的文件)。引号中两个项之间的空隔是必须的。
一、文件检测操作
如果程序会建立新的文件,在程序创建新文件之前,我们应先确定是否存在同名的文件,以免重要数据被覆盖掉。对于这种问题,我们可以使用–e选项,检测是否存在相同名字的文件。
例:
$filename = 'phper7.rar'; die "$filename 已经存在.\n" if -e $filename;
检测文件的选项是由连接线(-)和一个字母组成,字母指测试的类型,后接被测试的文件名或文件句柄。大多数选项返回true/false值,但有少数例外。
(1)-r, -w, -x以及-o检测相应的属性对effective user 或group ID是否为真,它是指实际负责运行此程序的用户。
(2)Unix文件系统包括几种类型,分别可有-f, -d, -l, -S, -p, -b, 以及-c检测,任何一种必属于其中之一。
(3)时间检测,-M, -A, -C(均大写),返回系统最后一次修改,访问,以及索引节点被修改到现在的天数。
(4)-T和-B分别检测一个文件是文本的还是二进制的。
(5)当给定的文件句柄是一个TTY(系统函数isatty()的返回结果,不能对文件名使用这个测试)时,-t文件检测项返回true。
一、if else 控制结构
一旦能比较两个值时,就希望能根据这些比较结果作判断。和别的语言类似,Perl中也提供了if控制结构。
如果需要另一种选择,可以使用关键字else。
NOTE:花括号是必须的(这一点和C,php不同)。
二、while 控制结构
while 语句可以循环执行其内部的一块代码直到其条件非真。
条件中真假值的判断和if结构中是一样的。和if控制结构相同,花括号是必须的。判断条件在迭代前执行,如果条件为假,则一次也不执行。
三、foreach 控制结构
foreach 从列表(数组)的第一个元素一直循环执行到最后一个元素,一次迭代一个。
foreach $list (qw/一 二 三/)
{
print "$list\n";
}
foreach 控制变量每一次迭代从列表中取出一个新值。
可以通过正则表达式来改变文本。到目前为止,只介绍过怎么匹配模式。现在,我们将向你演示怎样通过模式来改变字符串中相应地部分。
一、使用s///进行替换
如果将 m// 这个模式匹配看作同文字处理器的 查询(search) 类似的功能,那Perl中 s/// 操作的则类似于 查询并替换(search and replace) 。它将替换变量中模式所匹配上的部分。
$_ ="我喜欢打球"; s/很喜欢/不喜欢/; #很喜欢被不喜欢替换掉 print "$_\n";
如果没有匹配上,则什么也不会发生,此变量也不会有任何更改。
s///会返回一个Boolean 值。如果成功替换则返回true;否则返回false。
1.使用 /g 进行全局替换
在前面的例子中你可能已经注意到,s///值进行一次替换,无论是否还有地方还能匹配上。当然,这只是默认的行为。修饰符 /g 要求s///将不相重叠的所有匹配上的部分都进行替换。
$_ = "哇,好大的棉花糖哇!"; s/哇/哟/g; print "$_";
全局替换的一个常用地方是将多个空格用单个空格替换掉。
2.不同的分隔符
如同m//和qw//一样,我们也可以改变s///的分隔符。但这里使用了3个分隔符,因此有些不同。
通常的(非配对的)字符,由于没有左字符和右字符的区别,则可以像使用正斜线(/)那样使用。
如果使用的是配对的字符,也就是说其左字符和右字符不的,则必需使用两对:一对存放模式,一对存放替换的字符串。分隔符甚至可以是不同的。
一、使用m//匹配
我们曾经将模式放在一对正斜线(//)里面,如/fred/。这是m//(模式匹配)的一种简写。同qw//操作一样,可以使用任何成对的分隔符。
如果使用正斜线(/)作为分隔符,则可以省略掉前面的m。
二、可选的修饰符
有几个修饰符(modifier),通常叫做标记(flag),可以后缀在正则表达式后面来该变其默认的行为。
1.不区分大小写:/i
要创建一个大小写无关的模式,如匹配FRED时,也能匹配上fred, Fred,可以使用修饰符/i。
2.匹配任何字符:/s
默认情况下,点(.)不匹配换行符,这对于 单行中查找 的问题能很好解决。如果你的字符串中有换行符,并希望点(.)能匹配它们,那可以使用/s 这个修饰符。它将模式中点(.)的行为变成同字符类[\d\D]的行为类似:可以匹配任何字符,包括换行符。
3.添加空格:/x
/x 修饰符,允许你在模式中加入任何数量的空白,以方便阅读。
Perl中,注释可以被作为空白,因此使用/x,可以在模式中加上注释。
#号表示后面是注释,如果需要匹配井号,可以使用\#或[#]。注意不要在注释中使用闭分隔符,否则将结束此模式匹配。
4.将可选字符结合起来
如果在一个模式中需使用不止一个修饰符,可以一个接着一个。其顺序是不重要的。
Perl有许多区别于其它语言的特性。在所有这些特性中,最重要的一条是对正则表达式的支持。它允许你方便,快捷的处理字符串相关的问题。
正则表达式(regular expressions)是一种特殊语言写成的程序,内嵌于Perl之中。
一、什么是正则表达式
正则表达式,在Perl中通常被称为模式(pattern):某个模板是否匹配某个字符串。由于存在无限的字符串,某个给定的模式将这些字符串分成两类:一类是能匹配的,一类是不能匹配的。这里没有或者,大概,几乎那样的匹配。要么匹配,要么不匹配。
一个模式可以匹配多个字符串:1个,多个,或者无限个。也可能匹配除了1个,多个,或者无限个字符串之外的所有字符串。我们将正则表达式看作一种由简单语言实现的程序,这种语言只有一个任务:查找某个字符串,返回匹配上(it matches)或者不匹配(it doesnot match)。
二、使用简单的模式
要匹配某个模式(正则表达式)和$_的关系,可以将模式放在正斜线(//)之间
$_ ="hollo world";
if(/o w/){
print "it matches";
}
模式匹配通常返回true或false,因此经常用在if或while的条件表达式部分。