免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2177 | 回复: 5
打印 上一主题 下一主题

请教一个关于hash的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-18 13:32 |只看该作者 |倒序浏览
有这样的一个数据结构:

grp "hardware" {
12/24;
13/25;
14/26;
};
grp "software" {
15/27;
16/28;
17/29;
};

想以"hardware""software"作为key值,然后对应的{安装数量/总数量}里面的"安装数量"作为values值.

尝试过把\r\n 替换掉合并成一行再使用正则匹配,但好像在多个{}情况下,很难匹配到.

所以请教下这个结构 怎么匹配成hash方式呢?

论坛徽章:
0
2 [报告]
发表于 2011-11-18 14:13 |只看该作者
回复 1# Ammon


    按你要求,写了一个
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hash;
  5. my $key;
  6. while (<DATA>) {
  7.         if (/grp \"(\w+)\" \{/) {
  8.                 $key = $1;
  9.                 next;
  10.         }
  11.         if (/\};/) {
  12.                 undef $key;
  13.         }
  14.         if ($key) {
  15.                 push @{ $hash{$key} },(split /\//,$_)[0];
  16.         }
  17. }
  18. use Data::Dumper;
  19. print Dumper \%hash;

  20. __DATA__
  21. grp "hardware" {
  22. 12/24;
  23. 13/25;
  24. 14/26;
  25. };
  26. grp "software" {
  27. 15/27;
  28. 16/28;
  29. 17/29;
  30. };
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-11-18 14:21 |只看该作者
本帖最后由 Ammon 于 2011-11-18 14:25 编辑

谢谢了 代码很简洁 完全符合需求

可以帮忙再解释下

push @{ $hash{$key} },(split /\//,$_)[0];

这个[0] 是什么意思吗?

论坛徽章:
0
4 [报告]
发表于 2011-11-18 14:41 |只看该作者
回复 3# Ammon


    split后数组的第一个元素,就是你要的‘安装数量’:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use Data::Dumper;

  5. my $line = '12/24;';
  6. my @data = split /\//,$line;
  7. print Dumper \@data;
复制代码

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
5 [报告]
发表于 2011-11-18 14:47 |只看该作者
本帖最后由 yinyuemi 于 2011-11-18 14:55 编辑

回复 1# Ammon
  1. echo 'grp "hardware" {
  2. 12/24;
  3. 13/25;
  4. 14/26;
  5. };
  6. grp "software" {
  7. 15/27;
  8. 16/28;
  9. 17/29;
  10. };' |\
  11. perl -MData::Dumper -le 'while(<>){
  12.   if(/{/)
  13.     {$key=(split /"/)[1];}
  14.   elsif(/[0-9];$/)
  15.    {$value.=(split /\/|;/)[1]."\n"}
  16. else
  17.   {$hash{$key}=$value;$key=$value=""}
  18. }
  19. END{print Dumper \%hash}
  20. '
  21. $VAR1 = {
  22.           'software' => '27
  23. 28
  24. 29
  25. ',
  26.           'hardware' => '24
  27. 25
  28. 26
  29. '
  30.         };

复制代码

论坛徽章:
0
6 [报告]
发表于 2011-11-18 15:10 |只看该作者
回复 1# Ammon


    刚才一直没想起来范围操作符的使用方式,这样也比较好懂:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hash;
  5. my $key;
  6. while (<DATA>) {
  7.         if (/grp \"(\w+)\" \{/../\};/) {
  8.                 $key = $1;
  9.                 if (/(\d+)\/\d+/) {
  10.                         push @{$hash{$key}},$1;
  11.                 }
  12.         }
  13. }

  14. use Data::Dumper;
  15. print Dumper \%hash;

  16. __DATA__
  17. grp "hardware" {
  18. 12/24;
  19. 13/25;
  20. 14/26;
  21. };
  22. grp "software" {
  23. 15/27;
  24. 16/28;
  25. 17/29;
  26. };
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP