my $root = {}; my @stack; my $object = $root; use Data::Dumper; while () { if (m{^\s*\/\*}) { next } # assume single line comment elsif (m/^\s*END(_OBJECT)?/) { $object = pop(@stack); } elsif (m/^\s*OBJECT\s*=\s*(\S+)/) { my $new = { parent => $object, type = $1 }; push(@{$object->{children}}, $new); push(@stack, $object); $object = $new; } elsif (m/^\s*(\w+)\s*=\s*(\S*)/) { my $property = $1; my $value = $2; if ($value =~ m/^"/) { while ( (($value =~ tr/"//) % 2 != 0) && defined($_ = )) { s/^\s*//; $value .= $_; } } $object->{$property} = $value; } } print Dumper($root);