2

我有一个间隔列表(大约 42000)和一个值数组(几百万),我想从每个间隔的较长值列表中获取值。

有没有办法(或模块)我可以直接提取每个区间内的值,而不是遍历所有值并与每个区间的循环内的区间进行比较。这是非常耗时的。

例如:

foreach my $read_pos ( keys %{ $reads{$chr} } ) {  #$reads{$chr} is the list of all values
    if ( ( $read_pos >= $utr_start ) && ( $read_pos <= $utr_end ) ) { #$utr_start and $utr_end are intervals
        push( @{ $reads_tsx{$acc} }, $read_pos );
    }
}
4

1 回答 1

4

只需使用slice

@reads_tsx = @reads[$utr_start, $utr_end];

例子:

@nums = (1..200);
@slicenums = @nums[10..20];
print "@slicenums";

结果:

11 12 13 14 15 16 17 18 19 20 21

如果您想要几个间隔,也可以:

@nums = (1..200);
@slicenums = @nums[10..15,50..55,140..145];
print "@slicenums";

结果:

11 12 13 14 15 16 51 52 53 54 55 56 141 142 143 144 145 146

如果你有一个哈希,而不是一个列表:

%vals = (
    10 => "s10",
    30 => "s30",
    50 => "s50",
);
@nums = (0..200);
@slicenums = grep { exists($vals{$_}) } @nums[10..15,50..55,140..145];
print "@slicenums\n";
print "@vals{@slicenums}\n";

结果:

$ perl 1.pl
10 50
s10 s50

这里s10s50是到达间隔的键的对应值:10..15,50..55,140..145

于 2012-08-01T05:52:34.367 回答