#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my %hash = read_txt(); my $start = '00000'; my $xml = get_xml( \%hash, $start ); print $xml; sub get_xml { my ($hashref, $start) = @_; my $real_start = $hashref->{$start}->[0]; return get_node( $hashref, $real_start, 0 ); } sub get_node { my ($hashref,$name,$level) = @_; my $tab = "\t" x $level; my @children = map{ get_node( $hashref, $_, $level + 1 ) }@{ $hashref->{$name} || [] }; if ( @children ) { my $children_string = join "\n", @children; return sprintf "%s<%s>\n%s\n%s", $tab, $name, $children_string, $tab, $name; } return sprintf "%s<%s/>", $tab, $name; } sub read_txt { my %parent_child_map; while ( my $line = ) { chomp $line; next unless $line; my ($parent,$child) = split /\s+/, $line; push @{ $parent_child_map{ $parent } }, $child; } return %parent_child_map } __DATA__ 00000 A0361 A0361 A0323 A0323 A0351 A0351 A0362 A0351 A0363 A0323 A0324 A0324 A0325 A0324 A0326