#!/usr/bin/perl use strict; use warnings; use Data::Dumper; ## THESE TWO VARIABLES ARE FOR SIMULATION OF TABLE INSERTS ONLY, USE REAL DB OPERATIONS FOR ACTUAL USE my($idGen) = 0; my($tableData) = []; { my($data) = { USA => { IL => { SCHAUMBURG => {60194 => 0}, MATTESON => {60443 => 0}, }, OR => { WARRENTON => {97146 => 0}, }, }, # ... }; my($parentIds) = {}; processChildren($data, 0, undef, $parentIds); print Dumper($tableData); } sub processChildren { my($data, $level, $parentName, $parentIds) = @_; my($parentId) = $level <= 0 ? undef : $parentIds->{ ($level-1) . '-' . $parentName }; foreach my $k (keys %$data) { $parentIds->{ $level . '-' . $k } = doInsert($k, $parentId); if ($data->{$k} == 0) { return; } else { processChildren($data->{$k}, $level + 1, $k, $parentIds); } } } sub doInsert { my($name, $parentId) = @_; ## REPLACE BELOW WITH INSERT TO DB AND RETRIEVAL OF LAST_INSERT_ID() TO RETURN my($id) = $idGen++; push @$tableData, [$id, $name, $parentId]; return($id); }