use strict; use Data::Dumper; $Data::Dumper::Indent = 1; my %thingy; my @lines = ... # insert your data here for (sort @lines) { my ($type,$stuff) = $_ =~ /([A-Z]):\s+(.*)/; my @parts = split('/',$stuff); push @parts,''; my $str = q|$thingy{'| . shift(@parts) . q|'}|; for my $part (@parts) { $str .= qq|->{'$part'}|; } eval $str; } print Dumper \%thingy; #### my (@list,$flat); flatten($_,$thingy{$_}) foreach keys %thingy; sub flatten { my ($key,$rest) = @_; unless ($rest) { push @list,$flat; undef $flat; return; } $flat .= "$key/"; flatten(%$rest); } print Dumper \@list; #### $VAR1 = [ 'Location/', 'Topology/IPClassA/Device/log_ratio/' ];