perlquestion
Raad
Hi Monks,
I've been struggling with this problem for over a week now and I am about to admit failure at getting a working algorithm! I have a thesaurus of terms consisting of hierarchical tree structures which we use to index our library collection. My objective is to create a database like SQLite to store all existing entries (over 3,000). The thesaurus consists of a subject term and a unique identifier, a description and some other information. Example:<br> <br>
ID 211 <br>
TERM BODY REGIONS <br>
TREE A01 <br>
DESCRIPTION Anatomical areas of the body. <br>
<br>
ID 2 <br>
TERM ABDOMEN <br>
TREE A01.047 <br>
DESCRIPTION Portion of the body that lies between the <br>thorax and the pelvis.<br>
Since I experienced some problems creating foreign keys in SQLite, I decided to store my data in a Hash of Array like:<br>
<code>
%HoA =(
##id =>["term","parent_id","left_id", "right_id"]
1 => ["Body Regions","","",""],
2 => ["Extremities","1","",""],
3 => ["Arm","2","",""],
4 => ["Elbow","2","",""],
5 => ["Hand","2","",""],
6 => ["Fingers","5","",""],
7 => ["Thumbs","6","",""]
);
</code>
The algorith for nested sets calls for a recursive technique to populate children nodes. <br>
use strict;<br>
<code>
my %HoA;
my $k;
my $root = 1;
my $ctr =1;
for $k (sort keys %HoA){
walktree($root) unless $k eq"";
}
sub walktree{
my $id = shift;
$HoA{$k}[2]=$ctr++ if $id = $k;
##The walktree recursive sub below enters an eternal loop
##and doesn't execute properly. When I tried to push the
##children elements to a temporary array, it worked just
##fine. Would it be the $id???
walktree($id) if $id =$HoA{$k}[1] ;
$HoA{$k}[3]=$ctr++;
local $" = "|";
print "$k = @{$HoA{$k}}\n";
}
</code>
<br>
Could anybody direct me in the right direction? Or could you recommend an alternative algorithm using regex for instance? Any help would be appreciated.<br>
I've looked at the ISO Thesaurus modules on CPAN but our data does not conform to this standard. I've also looked at some XML approaches but it was mind boggling, to say the least.<br>
Thanks everybody...<br><br>
Raad
<p><small>Edited by [Chady] -- removed <br> tags from code. </small></p>