recursively passing hash reference
thealienz1
created: 2006-04-03 03:10:56

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 = " . join(',',@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

Re: recursively passing hash reference
created: 2006-04-03 03:49:32

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}->{children}={};}
		#print "\t" x $level . "first = " . $first . ", values = " . join(',',@items)."\n";
		$root->{$first}->{max} = add($root->{$first}->{children}, $level+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.

Re: recursively passing hash reference
created: 2006-04-03 05:25:54

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

perlmonks.org content © perlmonks.org and planetscape, thealienz1

prlmnks.org © 2006 edmund von der burg (eccles & toad)

v 0.03