use Text::Balanced qw/gen_extract_tagged/; my $text = q{hereiam[[one[[foo]]bar]]baz[[two]][[three]]wwhat}; my $parser = gen_extract_tagged "\Q[[", "\Q]]", qr/.*?(? [ "\Q[[" ] }; while (($extracted, $remainder) = $parser->($text) and $remainder ne $text) { print "$extracted\n"; $text = $remainder; }