+ -
当前位置:首页 → 问答吧 → 请教perl循环问题

请教perl循环问题

时间:2010-11-03

来源:互联网

两个文件
第一个文件两列,每行的两列数字构成一个区间,
11    20
30    50
等等
另外一个是一列数字,
类似,
12
15
30
45
50

等等

问题是想统计一下第2个文件中落在第一个文件中的数字的个数,例如,12落在了11    20之间,那么$hash{11    20}++一次,最后输出第一文件每行出现的次数。
关键的问题是每个文件都好几万行,循环起来比较慢,我想请教大家有什么好的建议,谢谢

作者: liuguiyou1981   发布时间: 2010-11-03

本帖最后由 zhlong8 于 2010-11-03 14:49 编辑

第一个文件的数字区间有交集没有? 总的范围有多大? 全都是整数吗? 闭区间还是左开右闭什么的?

所有区间范围小的话可以用list的index做键

比如建立个list

list:
[0][1][2]...[n]
      
第二个文件按你的规则把相当位的值加一,最后再读第一个文件,分析每个区间的数字个数

作者: zhlong8   发布时间: 2010-11-03

回复 zhlong8

没有交集,总的范围不固定,最多上千,都是整数,都是闭区间

作者: liuguiyou1981   发布时间: 2010-11-03

  1. my @info;
  2. my %result;    #保存结果的hash
  3. sub sum_from;


  4. open my $f, '<', 'file2' or die $!;

  5. while (<$f>) {
  6.     chomp;
  7.     $info[$_]++;  #因为最多上千,所以不会产生超大的array
  8. }

  9. close $f;

  10. open $f, '<', 'file1' or die $!;

  11. while (<$f>) {
  12.     chomp;
  13.     my($from, $to) = split /\s/;
  14.     $result{"$from $to"} = sum_of $from, $to;
  15. }

  16. sub sum_from {
  17.     my($from, $to) = @_;
  18.     my $sum = 0;
  19.     for (my $i=$from, $i<=$to; $i++) {
  20.         $sum += $info[$i];
  21.     }
  22. }
复制代码

作者: zhlong8   发布时间: 2010-11-03

热门下载

更多