#!/usr/bin/perl use strict; use warnings; use Data::Dumper; $Data::Dumper::Indent = 1; my $tree; my @refs; while () { chomp; my ($prefix) = /^(\s+)/; s/^$prefix// if $prefix; my $lvl = $prefix ? (length $prefix) / 2 : 0; my $rec = { label => $_, children => [] }; $refs[$lvl] = $rec; $#refs = $lvl; if ($tree) { push @{$refs[$lvl - 1]->{children}}, $rec; } else { $tree = $rec; } } print Dumper $tree; __DATA__ Building House Window Glas Silicium Door Roof Wood Hut Pizza Garage Door