sub x { my $aref = shift; my( $name, @kids ) = @_; push @{ $aref }, { name => $name } unless @$aref and $aref->[ -1 ]{ name } eq $name; x( $aref->[ -1 ]{ children } ||= [], @kids ) if @kids; }