免费注册 查看新帖 |

Chinaunix

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

hash 变量 问题 谢谢~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-21 09:07 |只看该作者 |倒序浏览
本帖最后由 Little-C 于 2010-10-25 07:49 编辑

输入类似这样的数据

a23:01-01-2009:s2
a22:01-05-2009:s2
a37:01-08-2009:s1
a23:01-11-2009:s1
a45:01-17-2009:s2
a37:01-21-2009:s1


想要输出的结果是

Animal Id        Station 1    Station 2
a23                    1               1
a37                    2               0
a45                    0               1

时间去掉  我只能做到输出是       a23      2
                                             a37      2
                                             a45      1

但是怎么分开s1和s2。。。。

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
2 [报告]
发表于 2010-10-21 09:14 |只看该作者
请贴上代码

论坛徽章:
0
3 [报告]
发表于 2010-10-21 09:17 |只看该作者

  1. my %animal_act;

  2. while (my $animal = <>) {
  3.     chomp $animal;
  4.    
  5.     my @animal;
  6.     @animal = split(":",$animal);
  7.    
  8.     my ($animal_name, $state) = (shift @animal, pop @animal);
  9.    
  10.     if (not exists ($animal_act{($animal_name)})) {
  11.         $animal_act{($animal_name)} = 0;
  12.     }
  13.     $animal_act{($animal_name)}=$animal_act{($animal_name)} + 1;
  14. }

  15. foreach my $animal_name (sort keys %animal_act) {
  16.    
  17.     print "$animal_name       $animal_act{($animal_name)}\n";   
  18. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2010-10-21 10:08 |只看该作者
回复 3# Little-C


    用两个key的hash
    改第11~14行为:
  1.     if (not exists ($animal_act{$animal_name}{$state})) {
  2.         $animal_act{$animal_name}{$state} = 0;
  3.     }
  4.     $animal_act{$animal_name}{$state}++;
复制代码
改第19行为:
  1. print "$animal_name       $animal_act{$animal_name}{"s1"}    $animal_act{$animal_name}{"s2"}\n";
复制代码

论坛徽章:
0
5 [报告]
发表于 2010-10-21 11:16 |只看该作者
回复 4# 珞水的大叔


但是有bug~~

已经有这个了
  1. if (not exists ($animal_act{$animal_name}{$state})) {
  2.         $animal_act{$animal_name}{$state} = 0
复制代码
但是为什么还是显示显示不出0~~

warning 显示的是 “Use of uninitialized value in concatenation (.) or string at as1.pl line 23, <> line 284.”

论坛徽章:
0
6 [报告]
发表于 2010-10-21 11:32 |只看该作者
回复 5# Little-C


    line 23是哪行

论坛徽章:
0
7 [报告]
发表于 2010-10-21 11:39 |只看该作者
回复 6# 珞水的大叔
  1. print "$animal_name    $animal_act{$animal_name}{s1}    $animal_act{$animal_name}{s2} \n";
复制代码
应该不是这行的问题。
因为输出的结果,显示不出0。
应该是0的地方是空的。

那个warning应该是说没有结果可以输出的意思。

论坛徽章:
0
8 [报告]
发表于 2010-10-21 11:54 |只看该作者
回复 7# Little-C


    那就是要么$state会有s1、s2之外的类型,要么是$state里面含有空格之类的异常字符,处理一下看看

论坛徽章:
0
9 [报告]
发表于 2010-10-21 12:34 |只看该作者
回复  Little-C


    那就是要么$state会有s1、s2之外的类型,要么是$state里面含有空格之类的异常字符 ...
珞水的大叔 发表于 2010-10-21 11:54



哦哦  我知道了
他好像在这种情况下默认0为 string了
所以在输出的时候没有显示0  还warning说不是数字

我在后面加了一个if  如果是0  就打出数字0 就好了。。。

论坛徽章:
0
10 [报告]
发表于 2010-10-21 13:23 |只看该作者
回复 9# Little-C


    这样也可以,呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP