免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
11 [报告]
发表于 2007-09-04 17:57 |显示全部楼层
原帖由 vio 于 2007-9-4 17:27 发表

请列书说明我的为什么不比你的完美,谢谢!

朋友,你好!关键是你的方法不完整啊,我不能看到结果!现在这个帖子已经有3个解决方案了!都好用

论坛徽章:
0
12 [报告]
发表于 2007-09-04 18:35 |显示全部楼层
原帖由 coolend 于 2007-9-4 17:16 发表
借用redspider大哥的代码,用堆栈...

#!/usr/bin/perl


use strict;

my (@head,@data);
my $stack_point = -1;

open(FILE, 'data.txt') or die $!;

while () {
    my @characters = split( ...


coolend朋友的代码太精妙了,稍微有点小瑕疵,$4是没用的,不过那不算什么!!

好玩,读这段代码真是一种享受!

请版主把这个帖子加精吧,这个帖子的代码体现的思想太好了,让其他网有友也看看!!

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

论坛徽章:
0
13 [报告]
发表于 2007-09-04 20:17 |显示全部楼层
原帖由 doiob 于 2007-9-4 20:06 发表
:wink:

open WENJIAN,"haha.txt" || die;
@alldata=;
$alldata=join('',@alldata);
@lalala=$alldata=~/\s*?(\S*?)\s*?=\s*?\(\s*?DESCRIPTION\s*?=\s*?\(\s*?ADDRESS_LIST\s*?=\s*?\(\s*?ADDR ...


好用,不过代码不好理解!我得仔细钻研钻研!!

  1. @alldata=<WENJIAN>;
  2. $alldata=join('',@alldata);
  3. @lalala=$alldata=~/\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;
复制代码

太不好理解了,还没理解

论坛徽章:
0
14 [报告]
发表于 2007-09-04 20:19 |显示全部楼层
doiob朋友能给解释一下吗?也没有循环,咋把文件读进去的?

论坛徽章:
0
15 [报告]
发表于 2007-09-04 20:40 |显示全部楼层
整个文件就是@alldata数组的一个元素吗?就是$alldata[0]?
刚做了一个试验

  1. open WENJIAN,"c:\\tnsnames.ora" || die;
  2. @alldata=<WENJIAN>;
  3. print "$alldata[0]\n";
  4. print "$alldata[1]\n";
  5. print "$alldata[2]\n";
  6. print "$alldata[3]\n";
  7. print "$alldata[4]\n";
  8. print "$alldata[5]\n";
  9. close(WENJIAN);
复制代码

tnsnames.ora文件的每一行是@alldata数组的一个元素

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

论坛徽章:
0
16 [报告]
发表于 2007-09-04 20:49 |显示全部楼层

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

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

还麻烦doiob网友解释一下吧

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

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

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


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

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

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

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

论坛徽章:
0
20 [报告]
发表于 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

编了个例子好理解了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP