论坛: 编程破解 标题: 咖啡帮我!~ 复制本贴地址    
作者: xingguojun [xingguojun]    论坛用户   登录
#!usr/bin/perl
$string="this is a string";
@array=split(//,$string);
foreach(@array){
if($_ne"a"){
$upcase=ork($_)&0xdf;
$string2.=chr($upcase);
}else{
$string2.=$_;
}
}
请问:我看书上说
在ascii表中,大写字符的区别在于第六位,小写字符的第六位是1,而对就大写字符的第六位是0。所以将小写字符用ord函数转换成数字,然后将该数字第六位转 换成0。最后将数字用chr函数转换字符,于是得到对应的大写字符。
请问那位perl高手能给我讲一下,上面到底说的是什么意思呀$_这个perl内置函数到底是做什么的呀?十分的感 谢您!!!







地主 发表时间: 04/23 21:53

回复: xingguojun [xingguojun]   论坛用户   登录
我知道了!~


B1层 发表时间: 04/25 15:24

回复: aoming [aoming]   版主   登录
首先要说的是你的脚本有错。

#!usr/bin/perl
$string="this is a string";
@array=split(//,$string);     

#把字符串this is a string用split去掉空格(你的那个脚本中匹配少了空格

split(/这里有个空格/,$string)
foreach(@array)

#然后分别把this、is、a、string当作数组@array中的元素。这里foreach(@array)的完整写法其实应该是foreach $_(@array),

{
if($_ne"a"){
$upcase=ork($_)&0xdf;   

#(ork改为ord;$_和ne之间要有空格)这里没看懂&0xdf是什么意思,&也许在这里是位与的运算符,我数学学的猪,还不懂位与,so这里丢丑了。。而0xdf显然是个16进制数,我转换了一下,其值为223

$string2.=chr($upcase);
#这里再用chr将ASCII的数值转换为相应的字符,如果&0xfd是与转换字符的ASCII值为大写的ASCII有关,那么可以猜测这个小脚本的目的是将一个字符的小写字母A转换为大写字母A

}else{
$string2.=$_;
}
}
#用.连接$string2

改好一些表达上的错误后,再脚本最后加了个输出print $string2;调试运行,最终得到这个输出效果:
TIaS
因此,整个脚本是将字符串的每个单词的首写转换成大写,如果遇到字母a,忽略处理。结果还说明&0xfd实现的确实是预先猜想的。整个小脚本是让人熟悉一些基本的标量转换操作,可惜关键的位与部分我却不懂,至于位与的运算,还请朋友们赐教。

$_   perl的预定义变量,或者说内部变量,perl语言预先设置好在缺省状态下默认要找的变量
类似的还有
$ARG、@_、%ENV等等
参考,不过看起来很头痛,是E文:( http://www.20cn.org/~aoming/wdzl/PerlLesson/perlmanual/perlvar.html#perlvar_name_0

ok,其实perl里有大小写字母转换的函数,lc()、uc()、lcfirst()、ucfirst()都可以实现。

B2层 发表时间: 04/25 18:41

回复: aoming [aoming]   版主   登录
哦,还差点忽略了说,那个#usr/bin/perl中感叹号改成小写。另外就是请以后发表主题时,将标题描述清楚。


B3层 发表时间: 04/25 18:42

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号