- 论坛徽章:
- 0
|
本帖最后由 iamlimeng 于 2010-05-22 12:43 编辑
回复 11# hu145165
学习了,在内存够大的情况确实是很好很高效的方法,这是关系型数据库的方法,我想到要用HASH过滤数据,减少计算,但没找到这个方法。
如果想节省内存,可以考虑在%hash中只存储@PTT的索引(行号),在条件判断时再去SPLIT,那样内存中就只有file1的数组@PTT和一个数据量不太大的%hash.- #!/usr/bin/perl
- use strict;
- use warnings;
- my %hash;
- open PTT, "file1" or die 'Can not open the required file file1 !';
- my @PTT = <PTT>;
- close PTT;
- for (0..$#PTT)
- {
- my @ptt = split /\s+/, $PTT[$_];
- push @{$hash{$ptt[0]}},$_;
- }
- open BR, "file2" or die 'Can not open the required file file2 !';
- while (my $BR_line = <BR>) {
- my @br = split /\s+/, $BR_line;
- if(exists $hash{$br[0]})
- {
- foreach my $no (@{$hash{$br[0]}})
- {
- my @ptt = split /\s+/, $PTT[$no];
- if($br[8] >= $ptt[1] and $br[9] <= $ptt[2])
- {
- chomp $BR_line;
- print $BR_line , ' ', join ' ',$PTT[$no];
- }
- }
- }
- }
- close BR;
复制代码 |
|