1

モジュールを使用しようとしていSet::IntervalTreeますが、要素をループに挿入すると、同じノードポインターが得られると思います。

それらをループの外側に次々と順番に挿入すると、ノードは正常に挿入され、find/find_window呼び出しは完全に機能します。しかし、ループに追加されたノードでは、find関数は奇妙な結果をもたらします。

#!/usr/bin/perl

use Set::IntervalTree;
my $tree = Set::IntervalTree->new;

$tree->insert("60:70", 60, 70);
$tree->insert("70:80", 70, 80);
$tree->insert("80:90", 80, 90);

for(my $i = 0; $i < 60; $i=$i+10)
{
    $j = $i+10;
    print "$i".":"."$j\n";
    $tree->insert("$i".":"."$j", $i, $i+10);
}

print $tree->str;

my $results1 = $tree->fetch(25, 28);
my $window = $tree->fetch_window(25,250);
my @arr1 = @$results1;
print " @arr1 found.\n";

my $results2 = $tree->fetch(65, 68);
my @arr2 = @$results2;
print " @arr2 found.\n";

これが出力です。ノードポインタを確認してください。ループから追加されたものは同じポインタを持ち、間違った間隔を返します(これは同じポインタ値が原因だと思います)。

Node:0x9905b20, k=0, h=9, mH=9  l->key=NULL  r->key=NULL  p->key=10  color=BLACK
Node:0x9905b20, k=10, h=19, mH=29  l->key=0  r->key=20  p->key=30  color=RED
Node:0x9905b20, k=20, h=29, mH=29  l->key=NULL  r->key=NULL  p->key=10  color=BLACK
Node:0x9905b20, k=30, h=39, mH=89  l->key=10  r->key=70  p->key=NULL  color=BLACK
Node:0x9905b20, k=40, h=49, mH=49  l->key=NULL  r->key=NULL  p->key=50  color=RED
Node:0x9905b20, k=50, h=59, mH=69  l->key=40  r->key=60  p->key=70  color=BLACK
Node:0x98c6270, k=60, h=69, mH=69  l->key=NULL  r->key=NULL  p->key=50  color=RED
Node:0x98fd138, k=70, h=79, mH=89  l->key=50  r->key=80  p->key=30  color=RED
Node:0x98fd078, k=80, h=89, mH=89  l->key=NULL  r->key=NULL  p->key=70  color=BLACK

 50:60 found.
 60:70 found.
4

2 に答える 2

1

insert内部ブロックから呼び出す場合は、Perl スカラー変数を使用する必要があるようです。補間された文字列を使用すると、それは破棄され、その後のブロックの実行によって上書きされます。

このコードはうまくいくようです。いつでも use strictuse warningsすべてのプログラムで、特に助けを求めているプログラムでお願いします。

#!/usr/bin/perl

use strict;
use warnings;

use Set::IntervalTree;
my $tree = Set::IntervalTree->new;

for (my $i = 0; $i <= 80; $i += 10) {
    my $name = sprintf '%02d:%02d', $i, $i+10;
    $tree->insert($name, $i, $i+10);
}

my $results1 = $tree->fetch(25, 28);
print "@$results1 found\n";

my $results2 = $tree->fetch(65, 68);
print "@$results2 found\n";

出力

20:30 found
60:70 found
于 2012-10-30T00:10:18.277 に答える
0

私はこのパッケージを使用しました。挿入の C++ コードには引数 (&t、int、int) があります。これは、C++ コードが最初の引数の perl データへのポインターを格納することを意味します。スカラーを使用することは、実際には解決策ではありません。最終的に値は上書きされます。私が使用した解決策は、IDをハッシュに入れて、ハッシュ値をIDとして渡すことでした。これにより、id の perl データが保持されます。C++ コードは、ID をコピーしてその値を維持する必要があります。

$id = "$start:$end";
$rephash1{$id} = $id;
$repeats1{$scaffold} = Set::IntervalTree->new if (!defined($repeats1{$scaffold}));
$repeats1{$scaffold}->insert($rephash1{$id}, $start, $end);
于 2015-02-20T22:56:35.390 に答える