免费注册 查看新帖 |

Chinaunix

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

怎样将其转换为hash结构呀~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-10-27 21:32 |只看该作者 |倒序浏览
本帖最后由 linghu002127 于 2011-10-27 23:22 编辑

数据如下:
  1. CD4-H2AK5ac        1000
  2. CD4-H2AK5ac        15008
  3. CD4-H2AK5ac        24000
  4. CD4-H2BK5ac        25000
  5. CD4-H2BK5ac        29000
  6. CD4-H2BK5ac        40001
  7. CD4-H4K12ac        40008
  8. CD4-H4K12ac        50005
  9. CD4-H4K12ac        80034
  10. H4R3me2        24000
  11. H4R3me2        25000
  12. H4R3me2        50005
复制代码
问题:
1)该两列能放进一个hash而不丢掉任何一个数据吗?因为hash要求key值唯一,但是这两列都有相同的,第一列不用说,如第二列24000,25000等在2个地方出现了。就我现在的perl水平,感到无论选那一列为键,有些数据都输不出来。

2)如果hash不行,那么采用其他方法怎样能做到这样:比如知道第一列中的CD4-H2BK5ac,就能输出其后边对应的数字。总之,知道相应的第一列文件名,对应的数字能依次给出(存数组或输出都可以,我想用他们做比较),但是文件名只出现一次。如下
  1. CD4-H2AK5ac        
  2. 1000
  3. 15008
  4. 24000

  5. H4R3me2       
  6. 24000
  7. 25000
  8. 50005
复制代码

论坛徽章:
0
2 [报告]
发表于 2011-10-27 21:51 |只看该作者

  1. #!/usr/bin/perl -w
  2. use strict;
  3. my @arr;
  4. while(<DATA>)
  5. {
  6.     push @arr,[split];
  7. }
  8. for(@arr)
  9. {
  10.     print "$_->[0] => $_->[1]\n";
  11. }

  12. __DATA__
  13. CD4-H2AK5ac        1000
  14. CD4-H2AK5ac        15008
  15. CD4-H2AK5ac        24000
  16. CD4-H2BK5ac        25000
  17. CD4-H2BK5ac        29000
  18. CD4-H2BK5ac        40001
  19. CD4-H4K12ac        40008
  20. CD4-H4K12ac        50005
  21. CD4-H4K12ac        80034
  22. H4R3me2        24000
  23. H4R3me2        25000
  24. H4R3me2        50005
复制代码

论坛徽章:
0
3 [报告]
发表于 2011-10-27 22:24 |只看该作者
  1. #!/usr/bin/perl

  2. use strict;

  3. my $hash = {};

  4. while ( <DATA> )
  5. {
  6.         if(  m/(\S*)\s*(\S*)/ )
  7.         {               
  8.                 $hash->{$1} = [] unless exists $hash->{$1};               
  9.                 push @{$hash->{$1}} ,$2;               
  10.         }       
  11. }

  12. foreach my $item (sort keys %{$hash} )
  13. {       
  14.         foreach my $arryitem ( @{$hash->{$item}} )
  15.         {
  16.                 print $item ,':',$arryitem,"\n";
  17.         }       
  18. }

  19. __DATA__
  20. CD4-H2AK5ac        1000
  21. CD4-H2AK5ac        15008
  22. CD4-H2AK5ac        24000
  23. CD4-H2BK5ac        25000
  24. CD4-H2BK5ac        29000
  25. CD4-H2BK5ac        40001
  26. CD4-H4K12ac        40008
  27. CD4-H4K12ac        50005
  28. CD4-H4K12ac        80034
  29. H4R3me2        24000
  30. H4R3me2        25000
  31. H4R3me2        50005
  32.        
复制代码

论坛徽章:
0
4 [报告]
发表于 2011-10-27 22:29 |只看该作者
本帖最后由 xfoucs 于 2011-10-27 22:31 编辑

回复 1# linghu002127
  1. #!/usr/bin/perl -w
  2. use strict;
  3. #use Data::Dumper;
  4. my @temp;
  5. my %hash;
  6. while(<DATA>)
  7. {
  8.     push @{$hash{(split)[0]}},(split)[1];
  9. }

  10. for(keys %hash)
  11. {
  12.     @temp=@{$hash{$_}};
  13.     print $_," => @temp\n";
  14. }

  15. #print Dumper %hash;

  16. __DATA__
  17. CD4-H2AK5ac        1000
  18. CD4-H2AK5ac        15008
  19. CD4-H2AK5ac        24000
  20. CD4-H2BK5ac        25000
  21. CD4-H2BK5ac        29000
  22. CD4-H2BK5ac        40001
  23. CD4-H4K12ac        40008
  24. CD4-H4K12ac        50005
  25. CD4-H4K12ac        80034
  26. H4R3me2        24000
  27. H4R3me2        25000
  28. H4R3me2        50005
复制代码

论坛徽章:
0
5 [报告]
发表于 2011-10-27 22:43 |只看该作者
本帖最后由 linghu002127 于 2011-10-27 23:23 编辑

回复 4# xfoucs


    2,3楼的方法都能完整输出数据,但是就是还是会使字符串名 CD4-H2AK5ac        H4R3me2多次出现,只想出现一次,而且要对应输出。例如给定CD4-H2AK5ac ,就只输出
      
1000
15008
24000


4楼方法正确~
谢谢大家~~

论坛徽章:
0
6 [报告]
发表于 2011-10-28 14:01 |只看该作者
二楼用的是re匹配,三楼用的是split函数。

二楼的代码改一下也符合。
  1. #!/usr/bin/perl

  2. use strict;

  3. my $hash = {};
  4. my @temp;

  5. while ( <DATA> )
  6. {
  7.         if(  m/(\S*)\s*(\S*)/ )
  8.         {               
  9.                 $hash->{$1} = [] unless exists $hash->{$1};               
  10.                 push @{$hash->{$1}} ,$2;               
  11.         }        
  12. }

  13. for (keys %$hash )
  14. {
  15.     @temp = @{$hash->{$_}};
  16.     print $_, "=> @temp \n"
  17. }


  18. __DATA__
  19. CD4-H2AK5ac        1000
  20. CD4-H2AK5ac        15008
  21. CD4-H2AK5ac        24000
  22. CD4-H2BK5ac        25000
  23. CD4-H2BK5ac        29000
  24. CD4-H2BK5ac        40001
  25. CD4-H4K12ac        40008
  26. CD4-H4K12ac        50005
  27. CD4-H4K12ac        80034
  28. H4R3me2        24000
  29. H4R3me2        25000
  30. H4R3me2        50005
复制代码

论坛徽章:
0
7 [报告]
发表于 2011-10-30 20:44 |只看该作者
第1列为键,键值为数组引用,数组放第2列值
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP