如何从perl中的数组中获取某个时间间隔内的元素?

时间:2012-08-01 05:43:46

标签: perl

我有一个间隔列表(大约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 );
    }
}

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

使用区间树数据结构