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 に答える