http://www.perlmonks.org?node_id=1032640


in reply to Help modifying recursive regex

Here's a regexp based solution, with minor tweeks on your code:

#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub strip_paren { my $input = $_[0]; our $re; $re = qr/ ( [^()]+ ) (?: \( ( (?: (??{$re}) )+ )+ \) )? /x; my @output = (); @output = $input =~ /$re/g; return @output; } sub print_crud { print "\nLine: ", shift, "\n"; foreach my $line (@_) { next if not defined $line; print " '$line'\n"; } } while (<DATA>) { chomp; print_crud( $_, strip_paren($_)); } exit; __DATA__ A A B A B C (A B) C A (B) C A (B C D) A(B C D) A (B C D) E A (B C D)E A (B C D) (E F G) A (B C D) (E F G) I A B (C (D E) (F G)) (H I) A B (C (D E) (F G)) (H I) J
I think it comes close to what you wanted.