给定变量一个值,在文件中找出符合该值的范围的记录的某个字段。

给定变量一个值,在文件中找出符合该值的范围的记录的某个字段。

大致的意思是:一个很大的文件A中每行有a,b,c三个字段,a、b是数字区间的最小和最大值,每行的区间都不重叠,一个可确定值的变量$t,$t被多次赋值(不小于500次),现在要从文件A中找出符合a<$t<b的那一行,然后把c打印出来,怎样做能得到较高的效率?
麻烦写出详细过程,谢谢!



[Copy to clipboard] [ - ]
CODE:
my $flag = 4;
while(<DATA>){
        my ($aa,$bb,$cc) = split;
        print $cc,"\n" if ($flag > $aa and $flag <$bb);
}

__END__
1 5 9
2 6 10
5 3 1

你认为这样效率很高?A是一个很大的文件啊,$t也被赋值很多次啊,我希望用hash做,希望高手帮忙,谢谢!
没人肯帮帮忙吗?
如果只读一次 没必要用hash
所以 你要说清楚需求
不好意思,是我的错,已经增加描述,请大家帮帮忙,谢谢!


QUOTE:
原帖由 dl0622 于 2008-10-17 12:38 发表
你认为这样效率很高?A是一个很大的文件啊,$t也被赋值很多次啊,我希望用hash做,希望高手帮忙,谢谢!



[Copy to clipboard] [ - ]
CODE:
#! /usr/bin/perl

use warnings;
use strict;

my %h;
my $t = 7;

while(<DATA>)
{
        my ($aa, $bb, $cc) = split;
        for(($aa + 1) .. ($bb - 1))
        {
                $h{$_} = $cc;
        }
}

print "$t\t$h{$t}\n";

__END__
1 5 a
6 10 b
11 15 c

因为区间没有重叠,所以可以用每个区间里的所有值作为hash的key,对应的c字段作为value,这样$hash{$t}即为所求。
但由于文件很大,又遍历了所有区间,要考虑你机器的内存是否够用。

楼上的,先谢谢你的解答!
但是这样遍历速度是不是很慢啊,要知道每个区间都是百万数量级以上的!
我现在的想法是,先把文件A中每一行都做一个hash,然后对每一个输入$t,去比较$t与做好的hash中的$aa和$bb字段,如果符合,则输出该hash的$cc字段,不知道这样的效率是否比循环比较A文件个字段效率高一些?

#! /usr/bin/perl

use warnings;
use strict;

my %h;
my $t = 12000001;

open DATA, "set" or die $!;
while (<DATA>) {
    chomp;
    $h{$.} = [ split ];
}
close DATA;

for (sort keys %h) {
    print "$h{$_}[2]\n" if ($t > $h{$_}[0] && $t < $h{$_}[1]);
}

__END__
2000000 2200000  set1(2000000-2200000)
12000000 22200000  set2(12000000-22200000)
30000000 32200000  set3(30000000-32200000)


文件A很大

你到底是  有很多字段 ?还是有很多记录集?