my $code = "( Tab1 ( TabA TabB ) Tab2 Tab3 )"; my @stack = split / /, $code; print Combine(\@stack); sub Combine { my $stack = shift; my $retval = ''; my @elements = (); while(scalar @{$stack}) { my $element = pop @{$stack}; if($element eq ')') { push @elements, '[' . Combine($stack) . ']'; } elsif($element eq '(') { last; } else { push @elements, $element; } } $retval .= join("#", reverse @elements); return $retval; }