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 strict在您的use 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 回答