Chinaunix

标题: hash 变量 问题 谢谢~~ [打印本页]

作者: Little-C    时间: 2010-10-21 09:07
标题: hash 变量 问题 谢谢~~
本帖最后由 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。。。。
作者: jason680    时间: 2010-10-21 09:14
请贴上代码
作者: Little-C    时间: 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. }
复制代码

作者: 珞水的大叔    时间: 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";
复制代码

作者: Little-C    时间: 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.”
作者: 珞水的大叔    时间: 2010-10-21 11:32
回复 5# Little-C


    line 23是哪行
作者: Little-C    时间: 2010-10-21 11:39
回复 6# 珞水的大叔
  1. print "$animal_name    $animal_act{$animal_name}{s1}    $animal_act{$animal_name}{s2} \n";
复制代码
应该不是这行的问题。
因为输出的结果,显示不出0。
应该是0的地方是空的。

那个warning应该是说没有结果可以输出的意思。
作者: 珞水的大叔    时间: 2010-10-21 11:54
回复 7# Little-C


    那就是要么$state会有s1、s2之外的类型,要么是$state里面含有空格之类的异常字符,处理一下看看
作者: Little-C    时间: 2010-10-21 12:34
回复  Little-C


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



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

我在后面加了一个if  如果是0  就打出数字0 就好了。。。
作者: 珞水的大叔    时间: 2010-10-21 13:23
回复 9# Little-C


    这样也可以,呵呵
作者: liyangole    时间: 2010-10-21 16:07
我也练习做了一个。散列的散列:
#!/usr/bin/perl
use strict;
my(%animal,$date,$station,$key);

format STDOUT_TOP =
Animal Id         Station 1          Station 2
-----------------------------------------------
.
format STDOUT =
@<<<<<<<<<<<<<<<<@<<<<<<<<<<<<<<<<<<<@<<<<<<<<
     $key           $animal{$key}{s1}     $animal{$key}{s2}
.

open F,"data.txt"||die "Can't open file: $!\n";
while (<F>){
        chomp;           
        ($key,$date,$station)=split/:/;
        $animal{$key}{s1}++ if $station =~ /s1/;
        $animal{$key}{s2}++ if $station =~ /s2/;
}
for $key (sort keys %animal){
       
        $animal{$key}{s1}=0 unless defined $animal{$key}{s1};
        $animal{$key}{s2}=0 unless defined $animal{$key}{s2};
        write ;
        #print "$key:\t$animal{$key}{s1}\t$animal{$key}{s2}\n";
}
作者: liyangole    时间: 2010-10-21 16:10
不过我有个问题 先将$animal{$key}{s1} 换成 $ranimal{$key}=$rec  $rec->{s1}的形式时候有问题,请帮忙添加个引用。
作者: liyangole    时间: 2010-10-21 16:27
我是了 几个位置定义引用都不能显示正确的数据。难道不能使用引用了吗???????
作者: liyangole    时间: 2010-10-21 16:35
估计在这 贴 没人能看到吧。
作者: Little-C    时间: 2010-10-22 04:56
估计在这 贴 没人能看到吧。
liyangole 发表于 2010-10-21 16:35



还木有学到散列~~帮你改了个题目~~希望有人能看到吧~~




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