免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3459 | 回复: 10

求助:一则小日志分析,附不完整代码(一类问题) [复制链接]

论坛徽章:
0
发表于 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 编辑 ]

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
发表于 2009-03-20 08:59 |显示全部楼层
去看看Config::IniFiles模块,可能有帮助。

论坛徽章:
0
发表于 2009-03-20 09:42 |显示全部楼层
应该不算复杂吧,我走进死胡同了,不用模块,想了解下此类问题是个啥解决思路。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-03-20 12:01 |显示全部楼层
原帖由 windows.li 于 2009-3-20 09:42 发表
应该不算复杂吧,我走进死胡同了,不用模块,想了解下此类问题是个啥解决思路。

你现在碰到啥问题了?不会解析 ini 文件?每读进来一行就判断下是不是 [label],若是,说明前一个 label 的内容已经完了;若不是,就继续往前一个 label 里面保存数据。

论坛徽章:
0
发表于 2009-03-20 12:06 |显示全部楼层
这个很简单吧?不需要模块
正则就OK了~
每次匹配[]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
发表于 2009-03-20 12:11 |显示全部楼层
原帖由 小公猫 于 2009-3-20 12:06 发表
这个很简单吧?不需要模块
正则就OK了~
每次匹配[]

用 regexp 也可以,如果文件不大的话整个读进来,然后匹配。

论坛徽章:
27
水瓶座
日期:2014-08-22 21:06:34程序设计版块每日发帖之星
日期:2015-11-25 06:20:0015-16赛季CBA联赛之新疆
日期:2015-12-19 19:05:48IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:31IT运维版块每日发帖之星
日期:2015-12-25 06:20:3315-16赛季CBA联赛之上海
日期:2016-04-15 19:51:31程序设计版块每日发帖之星
日期:2016-04-17 06:23:29程序设计版块每日发帖之星
日期:2016-04-23 06:20:00程序设计版块每日发帖之星
日期:2016-05-26 06:20:00每日论坛发贴之星
日期:2016-05-26 06:20:0015-16赛季CBA联赛之辽宁
日期:2017-02-16 23:59:47
发表于 2009-03-20 13:18 |显示全部楼层
while (<DATA>){
   if(/^\[/){
   chomp;
   print "\n".$_."=>";
   }
   else{
   chomp;
   print " $_";
   }

}

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

论坛徽章:
0
发表于 2009-03-20 16:03 |显示全部楼层
的确有很多方法解决。
但是按我顶楼的思路,是否可以继续写下去?

论坛徽章:
0
发表于 2009-03-20 16:14 |显示全部楼层
7楼的实现方法最直接~~~~~~~顶。

论坛徽章:
0
发表于 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.


求问这个是怎么回事???
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP