免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zhouhaiming
打印 上一主题 下一主题

大家好!请问用什么办法能把这段文本拆解啊? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2007-09-04 20:49 |只看该作者

  1. @lalala=$alldata=~/XXX/igs;
复制代码

怎么会把反向引用的东西自动赋值给$alldata了呢?
哈哈,是啊,我就是生用!硬着头皮做!
上面的用法好像匹配时自动迭代啊,我猜应该是那样
得好好查查igs在进行正则匹配时候的含义了

还麻烦doiob网友解释一下吧

知识都是一点一滴积累起来的,愚公还能移山呢,慢慢来吧!超过30了学习东西慢了!

[ 本帖最后由 zhouhaiming 于 2007-9-4 20:55 编辑 ]

论坛徽章:
0
32 [报告]
发表于 2007-09-04 20:50 |只看该作者

来个gawk

bash-3.2$ gawk  '
BEGIN{RS="\n\n+"}
{
  r=match($0,"^\n*([a-zA-Z0-9_]*) *=.*\\(HOST *= *([0-9\.]*) *\\) *\\(PORT *= *([0-9]*)\\).*\\(SERVICE_NAME *= *([0-9a-zA-Z_]*) *\\)",a);
  if(r>0){
     print a[1],a[2],a[3],a[4];
  }
}
' t.txt
gawk: cmd. line:4: warning: escape sequence `\.' treated as plain `.'
PSDSS249 10.136.33.249 1521 PSDSS
PSDSS248 10.136.33.248 1521 PSDSS
FZJC 10.136.33.3 1521 fzjc

论坛徽章:
0
33 [报告]
发表于 2007-09-04 21:06 |只看该作者
修饰词  含义  
/i  或略字母大小写  
/m  令 ^ 和 $ 匹配随后嵌入的 \n。  
/s  令 . 匹配换行符并且忽略废弃了的 $*。  
/x  或略(大多数)空白并且允许在模式里的注释  
/o  只编译模式一次  
/g  全局地查找所有匹配  
/e  把右边当作一个表达式计算

论坛徽章:
0
34 [报告]
发表于 2007-09-04 21:15 |只看该作者
原帖由 doiob 于 2007-9-4 21:06 发表
修饰词  含义  
/i  或略字母大小写  
/m  令 ^ 和 $ 匹配随后嵌入的 \n。  
/s  令 . 匹配换行符并且忽略废弃了的 $*。  
/x  或略(大多数)空白并且允许在模式里的注释  
/o  只编译模式一次  
/g  全 ...


ig的用意懂了,不过对s的用意还是不懂:.能匹配换行符理解,忽略废弃的$*不明白,另外,正则的匹配运算怎么会把反向引用的部分赋值给变量了呢,我的理解只能用$1、$2、$3......来引用反向引用的部分啊

论坛徽章:
0
35 [报告]
发表于 2007-09-04 21:47 |只看该作者
根据25楼进一步简化了一下:
open WENJIAN,"haha.txt" || die;
@lalala=join('',<WENJIAN>)=~/\s*?(\S*?)\s*?=\s*?\(\s*?DESCRIPTION\s*?=\s*?\(\s*?ADDRESS_LIST\s*?=\s*?\(\s*?ADDRESS\s*?=\s*?\(\s*?PROTOCOL\s*?=\s*?TCP\s*?\)\s*?\(\s*?HOST\s*?=\s*?(.*?)\s*?\)\s*?\(\s*?PORT\s*?=\s*?(.*?)\s*?\)\s*?\)\s*?\)\s*?\(\s*?CONNECT_DATA\s*?=\s*?\(\s*?SERVICE_NAME\s*?=\s*?(.*?)\s*?\)\s*?\)\s*?\)\s*?/igs;
while (@lalala){
  print shift @lalala , shift @lalala ,shift @lalala,shift @lalala,"\n";
}
close(WENJIAN);

[ 本帖最后由 zhangshebao 于 2007-9-4 21:53 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2007-09-04 21:56 |只看该作者
zhouhaiming  :
=~先运运算,结果出来再进行赋值

论坛徽章:
0
37 [报告]
发表于 2007-09-04 22:14 |只看该作者
研究了半宿,终于研究明白了
=~优先级高于=的优先级(可以通过perdoc perlop查看手册)
起作用的关键是g那个关键字,表示贪婪匹配,is其实可以省略的,

正则表达式匹配后,将结果作为列表返回,依次赋值给数组的各个元素。

论坛徽章:
0
38 [报告]
发表于 2007-09-04 22:16 |只看该作者
以前一直以为只有通过$1、$2、$3、$4才能取出正则匹配的内容,又学了一招,努力进步ing

论坛徽章:
0
39 [报告]
发表于 2007-09-04 22:22 |只看该作者
C:\>type test20.pl
$a = "111 222 333 a b";
my($b, $c, $d, $e, $f) = $a =~ /(\w+)\s+(\w+)\s+(\w+)\s+(\w+)\s+(\w+)/;
print "b值为:$b\n";
print "c值为:$c\n";
print "d值为:$d\n";
print "e值为:$e\n";
print "f值为:$f\n";

C:\>perl test20.pl
b值为:111
c值为:222
d值为:333
e值为:a
f值为:b

编了个例子好理解了

论坛徽章:
0
40 [报告]
发表于 2007-09-05 12:32 |只看该作者
原帖由 zhangshebao 于 2007-9-4 22:47 发表
open WENJIAN,"haha.txt" || die;
@lalala=join('',<WENJIAN>)=~/\s*?(\S*?)\s*?=\s*?\(\s*?DESCRIPTION\s*?=\s*?\(\s*?ADDRESS_LIST\s*?=\s*?\(\s*?ADDRESS\s*?=\s*?\(\s*?PROTOCOL\s*?=\s*?TCP\s*?\)\s*?\(\s*?HOST\s*?=\s*?(.*?)\s*?\)\s*?\(\s*?PORT\s*?=\s*?(.*?)\s*?\)\s*?\)\s*?\)\s*?\(\s*?CONNECT_DATA\s*?=\s*?\(\s*?SERVICE_NAME\s*?=\s*?(.*?)\s*?\)\s*?\)\s*?\)\s*?/igs;
while (@lalala){
  print shift @lalala , shift @lalala ,shift @lalala,shift @lalala,"\n";
}
close(WENJIAN);

好多shift..
print join "\t", splice @lalala, 0, 4;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP