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



QUOTE:
原帖由 zhouhaiming 于 2007-9-4 13:35 发表
下面是最终完美版!

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


QUOTE:
原帖由 vio 于 2007-9-4 17:27 发表

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

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


QUOTE:
原帖由 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是没用的,不过那不算什么!!

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

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

呵呵~~~ LZ细心,已经去掉 $4 了


[Copy to clipboard] [ - ]
CODE:
open WENJIAN,"haha.txt" || die;
@alldata=<WENJIAN>;
$alldata=join('',@alldata);
@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;
while(@lalala)
{
        $name=shift @lalala;
        $host=shift @lalala;
        $port=shift @lalala;
        $service_name=shift @lalala;
        print "$name\t$host\t$port\t$service_name\n";
}
close(WENJIAN);



QUOTE:
原帖由 doiob 于 2007-9-4 20:06 发表


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 ...

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

[Copy to clipboard] [ - ]
CODE:
@alldata=<WENJIAN>;
$alldata=join('',@alldata);
@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;

太不好理解了,还没理解
doiob朋友能给解释一下吗?也没有循环,咋把文件读进去的?
就这句啊,@alldata=<WENJIAN>,把整个文件存入一个数组。
整个文件就是@alldata数组的一个元素吗?就是$alldata[0]?
刚做了一个试验

[Copy to clipboard] [ - ]
CODE:
open WENJIAN,"c:\\tnsnames.ora" || die;
@alldata=<WENJIAN>;
print "$alldata[0]\n";
print "$alldata[1]\n";
print "$alldata[2]\n";
print "$alldata[3]\n";
print "$alldata[4]\n";
print "$alldata[5]\n";
close(WENJIAN);

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

看来你基本的东西还没来得及看啊,整个文件的每一行是数组的一个元素。然后将整个数组(也就是整个文件的内容)转换成一个标量$alldata,用正则进行提取,将结果存入@lalala。