Chinaunix

标题: 求助:一则小日志分析,附不完整代码(一类问题) [打印本页]

作者: windows.li    时间: 2009-03-20 08:31
标题: 求助:一则小日志分析,附不完整代码(一类问题)
[ABC1]
jack
lily
[ABC2]
john
susan
suse


如何输出这种结构:
[ABC1]=>jack lily
[ABC2]=>john susan suse


我的思路如下:
while (<DATA>){
   $k = $_ if /\[ABC\d+\]/;
   if (/(^\d+)/){
      $v = $1;
      push @{$hash{$k}}, $v;
   }
.............#在这里,不会写了..如何设置标志位还是...?
print "$k=>@{$hash{$k}}\n";
}

__END__
[ABC1]
jack
lily#如果这后面有个空白哦行的话,可以遇到空白行(标志位)就停下来print。当然可以自己事先通篇设置空白行,不过太蠢吧
[ABC2]
john
susan
suse


我首先先到的就是“数组的哈希”结构,所以用了这种方法(不可否认,还有其他方法,设置$/,再用正则,我也测试OK了)。
诸位,帮我看看,按数组的哈希这种结构,该如何写下去,多谢大家!

[ 本帖最后由 windows.li 于 2009-3-20 09:18 编辑 ]
作者: wxlfh    时间: 2009-03-20 08:59
去看看Config::IniFiles模块,可能有帮助。
作者: windows.li    时间: 2009-03-20 09:42
应该不算复杂吧,我走进死胡同了,不用模块,想了解下此类问题是个啥解决思路。
作者: MMMIX    时间: 2009-03-20 12:01
原帖由 windows.li 于 2009-3-20 09:42 发表
应该不算复杂吧,我走进死胡同了,不用模块,想了解下此类问题是个啥解决思路。

你现在碰到啥问题了?不会解析 ini 文件?每读进来一行就判断下是不是 [label],若是,说明前一个 label 的内容已经完了;若不是,就继续往前一个 label 里面保存数据。
作者: 小公猫    时间: 2009-03-20 12:06
这个很简单吧?不需要模块
正则就OK了~
每次匹配[]
作者: MMMIX    时间: 2009-03-20 12:11
原帖由 小公猫 于 2009-3-20 12:06 发表
这个很简单吧?不需要模块
正则就OK了~
每次匹配[]

用 regexp 也可以,如果文件不大的话整个读进来,然后匹配。
作者: shijiang1130    时间: 2009-03-20 13:18
while (<DATA>){
   if(/^\[/){
   chomp;
   print "\n".$_."=>";
   }
   else{
   chomp;
   print " $_";
   }

}

__END__
[ABC1]
jack
lily
[ABC2]
john
susan
suse

作者: windows.li    时间: 2009-03-20 16:03
的确有很多方法解决。
但是按我顶楼的思路,是否可以继续写下去?
作者: 逝去的华丽    时间: 2009-03-20 16:14
7楼的实现方法最直接~~~~~~~顶。
作者: yzhkpli    时间: 2009-03-24 08:17
原帖由 shijiang1130 于 2009-3-20 13:18 发表
while (){
   if(/^\[/){
   chomp;
   print "\n".$_."=>";
   }
   else{
   chomp;
   print " $_";
   }

}

__END__
[ABC1]
jack
lily
[ABC2]
john
susan
suse



我用了之后,报告:

./xxxx testdata090324aa.datab
Name "main:ATA" used only once: possible typo at ./xxxx line 3.
readline() on unopened filehandle DATA at ./xxxx line 3.


求问这个是怎么回事???
作者: flw    时间: 2009-03-24 08:58
原帖由 shijiang1130 于 2009-3-20 13:18 发表
while (){
   if(/^\[/){
   chomp;
   print "\n".$_."=>";
   }
   else{
   chomp;
   print " $_";
   }

}

__END__
[ABC1]
jack
lily
[ABC2]
john
susan
suse

提取公因子 chomp,可以让程序更加简化。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2