thealienz1 has asked for the wisdom of the Perl Monks concerning the following question:

I am currently working on code that creates something simliar to a trie structure. My implementation is pretty much trying to create a hash of hash, etc... which should be a problem as I believe I have enough memory.

I have come to a bit a pickle though. It might be that I have been working on this program for awhile and that it is late, but I have come to stopping point. For the life of my I am not able to implement a simple hash reference recursion. Let me explain with my code and expected output.

use strict; use Data::Dumper; my $start; sub add{ my $root = shift; my $level = shift; my @items = @_; if(!@items) {return;} #print "level = $level\n"; while(@items) { my $first = shift @items; $root->{$first}->{count}++; #print "\t" x $level . "first = " . $first . ", values = " . j +oin(',',@items)."\n"; add($root->{$first}->{children}, $level+1, @items); } } add($start, 1, 1..3); add($start, 1, 1..2); print Dumper($start);

Expected output

$VAR1 = { '1' => { 'children' => { '2' => { 'children' => { '3' => { 'count'=>1} }, 'count' => 2}, '3' => {'count' => 1} }, 'count' => 2 }, '3' => { 'count' => 1 }, '2' => { 'children' => { '3' => { 'count' => 1 } }, 'count' => 2 } };

I realize its probably something really trivial that I am missing here, but any help is a appreciated.

Thanks

Replies are listed 'Best First'.
Re: recursively passing hash reference
by planetscape (Chancellor) on Apr 03, 2006 at 09:25 UTC

    atcroft has a very nice recursive function here which can handle a multilevel data structure consisting of arrays, hashes, and scalars. Perhaps you can adapt it to your needs or at least use it as a reference for constructing your own.

    HTH,

    planetscape
Re: recursively passing hash reference
by thealienz1 (Pilgrim) on Apr 03, 2006 at 07:49 UTC

    Alright, just an update. I believe I have found the problem.

    use strict; use Data::Dumper; my $start = {}; sub add{ my $root = shift; my $level = shift; my @items = @_; if(!@items) {return $level-1;} #print "level = $level\n"; while(@items) { my $first = shift @items; $root->{$first}->{count}++; if(!exists($root->{$first}->{children})) {$root->{$first}->{ch +ildren}={};} #print "\t" x $level . "first = " . $first . ", values = " . j +oin(',',@items)."\n"; $root->{$first}->{max} = add($root->{$first}->{children}, $lev +el+1, @items); } } add($start, 1, 1..4); add($start, 1, 1..2); print Dumper($start);

    I was passing hash reference that were undefined, which is not a good thing apparently. So, I fixed that problem.