use strict ; use warnings ; use Data::Dump qw( dump ) ; my @data = ; my $data = join( '', @data ) ; my @info_box_contents ; while( $data =~ m/( {{Infobox .*? ({{(?=}}))? .*? }} )/xsg ) { print STDERR "MATCHED\n"; push @info_box_contents, $1 ; } dump( \@info_box_contents ) ; __DATA__ {{Infobox text text text {{text text text text {{text text}} text}} {{{text {{text }} text }}} }} blah blah blah blah blah blah {{Infobox text1 text1 text1 {{text1 text1 text1 text1 {{text1 text1}} text1}} {{{text1 {{text1 }} text1 }}} }} {{Infobox one}}