大家好!请问用什么办法能把这段文本拆解啊?



[Copy to clipboard] [ - ]
CODE:
@lalala=$alldata=~/XXX/igs;

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

还麻烦doiob网友解释一下吧

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

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
修饰词  含义  
/i  或略字母大小写  
/m  令 ^ 和 $ 匹配随后嵌入的 \n。  
/s  令 . 匹配换行符并且忽略废弃了的 $*。  
/x  或略(大多数)空白并且允许在模式里的注释  
/o  只编译模式一次  
/g  全局地查找所有匹配  
/e  把右边当作一个表达式计算


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

i和g的用意懂了,不过对s的用意还是不懂:.能匹配换行符理解,忽略废弃的$*不明白,另外,正则的匹配运算怎么会把反向引用的部分赋值给变量了呢,我的理解只能用$1、$2、$3......来引用反向引用的部分啊
根据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);

zhouhaiming  :
=~先运运算,结果出来再进行赋值
研究了半宿,终于研究明白了
=~优先级高于=的优先级(可以通过perdoc perlop查看手册)
起作用的关键是g那个关键字,表示贪婪匹配,i和s其实可以省略的,

正则表达式匹配后,将结果作为列表返回,依次赋值给数组的各个元素。
以前一直以为只有通过$1、$2、$3、$4才能取出正则匹配的内容,又学了一招,努力进步ing
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

编了个例子好理解了


QUOTE:
原帖由 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;