+ -
当前位置:首页 → 问答吧 → 一个文件处理问题如何用perl写出更短的代码解决

一个文件处理问题如何用perl写出更短的代码解决

时间:2011-02-12

来源:互联网

test文件内容为:
aaa
001            123            728273
002            456            283940
003            789            928374
aaa
001            287            394872
003            729            493827
aaa
002            321            324815
bbb
003            524            520487
bbb
002            826            883674
003            673            092847
bbb
001            427            374859

要求分别得出aaa、bbb下001、002、003行中二列和三列的和,如:
aaa
001            410            1123145
002            777            608755
003            1518          1422201
bbb
001            427            374859
002            826            883674
003            1197          613334
这是shell版的一个问题,我自己想着用perl解决,但是写出来的代码感觉很搓,望高手能给出更短的代码解决这个问题。
下面是我自己瞎写的
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;
  4. my %result;
  5. my $id1;
  6. while(<>){
  7.         my @temp=split;
  8.         my $id2;
  9.         if($#temp == 0){
  10.                 $id1=$temp[0];
  11.         } else {
  12.            $id2 = shift @temp;
  13.            unless(defined $result{$id1}{$id2})
  14.                 {
  15.                         $result{$id1}{$id2}=\@temp;
  16.                 }else{
  17.                         for(my $i=0;$i<=$#temp;$i++)
  18.                                 {
  19.                                         $result{$id1}{$id2}->[$i]+=$temp[$i];
  20.                                 }
  21.                 }


  22.         }
  23. }
  24. for my $i (sort keys %result){
  25.         print $i,"\n";
  26.         for my $j (sort { $a <=> $b } keys %{$result{$i}})
  27.         {
  28.                 print "$j\t",$result{$i}{$j}->[0],"\t",$result{$i}{$j}->[1],"\n";       }
  29. }
复制代码
希望高手们能帮我指出不规范的地方。。。谢谢了!

作者: zzy7186   发布时间: 2011-02-12

用hash啊

作者: x9x9   发布时间: 2011-02-12



QUOTE:
用hash啊
x9x9 发表于 2011-02-12 18:40




    我自己写的就是用hash的
    $VAR1 = {
          'bbb' => {
                     '002' => [
                                '826',
                                '883674'
                              ],
                     '003' => [
                                1197,
                                613334
                              ],
                     '001' => [
                                '427',
                                '374859'
                              ]
                   },
          'aaa' => {
                     '003' => [
                                1518,
                                1422201
                              ],
                     '002' => [
                                777,
                                608755
                              ],
                     '001' => [
                                410,
                                1123145
                              ]
                   }
        };

作者: zzy7186   发布时间: 2011-02-12