免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1567 | 回复: 3
打印 上一主题 下一主题

高手帮忙看下这几个语句 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-14 10:38 |只看该作者 |倒序浏览
chomp( @buf = <>; ) ;
($ip) = ( $buf[10] =~ /Framed-IP-Address\s*=\s*(\d+\.\d+\.\d+\.\d+)/ ) ;
$buf[2] =~ s/(..)/sprintf("%d.",hex $1)/eg ;
$hstr = "outbound:dial-number=$dn" ;
$hstr =~ s/(.)/sprintf("%02x",ord $1)/eg ;
if ( $ip )
{
   .......
}
在这里 $ip的值不是类似 "192.168.1.1" 这种形式吗
那么perl中可以if("192.168.1.1"这样用? 刚接触这门语言希望高手指点一下

我在一些资料上看到如下语:

$value="%A4T%A4K%21";
$vlaue=~s/%([a-fA-F0-9][a-fA-F0-9]/pack("c",hex($1))/eg;
解释为:
在传送CGI数据的时候会把数据编码,其中会将特殊字符或是中文字符编码以%开头的连续的两个十六进制数的字符串,所以要用s这个函数来找寻这个以%开头的字符串。为了要把找到的字符串再做解码的处理,所以要在%这个符号之后加上()这个符号,表示会把找到的字符串记忆起来并指定给$1这个变量,而且要在()中加上代表是连续两个十六进制数值的文字处理模式(Regular Expression),也就是[a-fA-F0-9][a-fA-F0-9]。再用hex这个函数($1是代表符合的字符串)把十六进制数值转成十进制的码,之后再用pack这个函数(以C为参数,是代表unsigned char value的意思)把这个十进制码还原成原来的字符串。最后就会把这个字符串解码成$value="三八!"。值得一提的是也可以把这个解码的程序写成:
$value=~s/%(..)/pack("C",hex($1))/eg;

在这里的
$value=~s/%(..)/pack("C",hex($1))/eg;
和 $buf[2] =~ s/(..)/sprintf("%d.",hex $1)/eg ;  相似
前面有人解释
$hstr =~ s/(.)/sprintf("%02x",ord $1)/eg ;
是将$1($hstr中的任意字符)的ascii码值转化为十六进制,显示为2位数,不足二位的前面用0补足
我对着想了半天还是不敢确定, 请高手帮忙解释下
$buf[2] =~ s/(..)/sprintf("%d.",hex $1)/eg ;
的意思,特别是"(..)"中的两个点代表什么东东? 谢谢!


前面发贴让我把标题写的有意义些,可能我写的太长, 发贴失败!我又重写了一大串
    

论坛徽章:
0
2 [报告]
发表于 2005-01-14 11:07 |只看该作者

高手帮忙看下这几个语句

if($var)  的意思等同于  if(defined $var)就是说如果存在这个变量,那么就为真

第二个问题,(..)代表任意两个字符,比如$buf="0123456789abcdef";
那么分别赋值$1为01,23,45,67,89,ab...

论坛徽章:
0
3 [报告]
发表于 2005-01-14 11:16 |只看该作者

高手帮忙看下这几个语句

建议楼主先补充点基本知识。。
不要一开始就研究正则(发现你近来问候的都是正则)和简化写法。
Perl。特别灵活的写法。
不补充的基本知识你会越看越糊涂的。
正则是Perl的精华,也是非常灵活,先搞清楚  . * ? 等符号的意义和 $1,$2和括号的代表。不然。。越看越晕哦:)

论坛徽章:
0
4 [报告]
发表于 2005-01-14 11:32 |只看该作者

高手帮忙看下这几个语句

文字处理模式中,/pattern/常用到的语法

/pattern/ 结果
除了换行字符\n外,找寻只有一个字符的字符串

x? 找寻0个或是1个x字符
x* 找寻0个或是0个以上的x字符
.* 找寻0个或是0个以上的任何字符
x+ 找寻0个或是1个以上的x字符
.+ 找寻1个或是1个以上的任何字符
{m} 找寻刚好是m个个数指定的字符
{m,n} 找寻在m个数个数以上,n个个数以下指定的字符
{m,} 找寻m个个数以上指定的字符
[] 找寻符合[]内的字符
[^] 找寻不符合[]内的字符
[0-9] 找寻符合0到9的任何一个字符
[a-z] 找寻符合a到z的任何一个字符
[^0-9] 找寻不符合0到9的任何一个字符
[^a-z] 找寻不符合a到z的任何一个字符
^ 找寻字符开头的字符
$ 找寻字符结尾的字符
\d 找寻一个digit(数字)的字符,和[0-9]语法一样
\d+ 找寻一个digit(数字)以上的字符串,和[0-9]+语法一样
\D 找寻一个non-digit(非数字)的字符,和[^0-9]语法一样
\D+ 找寻一个non-digit(非数字)以上的字符,和[^0-9]+语法一样
\w 找寻一个英文字母或是数值的字符,和[a-zA-Z0-9]语法一样
\w+ 找寻一个以上英文字母或是数值的字符,和[a-zA-Z0-9]+语法一样
\W 找寻一个非英文字母,数值的字符,和[^a-zA-Z0-9]语法一样
\W+ 找寻一个以上非英文字母,数值的字符,和[^a-zA-Z0-9]+语法一样
\s 找寻一个空白的字符,和[\n\t\r\f]一样
\s+ 找寻一个以上空白的字符,和[\n\t\r\f]+一样
\S 找寻一个非空白的字符,和[^\n\t\r\f]一样
\S+ 找寻一个以上非空白的字符,和[^\n\t\r\f]+一样
\b 找寻一个不以英文字母,数值为边界的字符串
\B 找寻一个以英文字母,数值为边界的字符串
a|b|c 找到符合a字符或是b字符或是c字符的字符串
abc 找到一个含有abc的字符串
(pattern) ()这个符号是会记忆所找寻到的字符,是一个很实用的语法
第一个()内所找到的字符串变成$1这个变量或是\1变量
第二个()内所找到的字符串变成$2这个变量或是\2变量
以此类推,笔者会在下一小节中详细介绍它的用法

/pattern/i i这个参数是代表忽略英文大小写的意思,也就是在找寻字符 串的时候,不会去考虑英文的大小写
\ 如果要在pattern模式中找寻一个有特殊的意义的字符,要在 这个字符前加上\这个符号,这样才会让这个特殊字符失效

我可没少看呀
$1 $2分别代表匹配的第一个()和第二个()的东东
(..)我的理解是对的,不过对if($var)的用法非常感谢superdoctor !
同时感谢所有帮忙的人 ^_^
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP