Is this what you want???
use strict;
use warnings;
use 5.012;
use Text::Balanced qw(
extract_tagged
extract_multiple
);
my $text = <<'END_OF_STRING';
{{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}}
END_OF_STRING
my @infoboxes = extract_multiple( $text, [ \&my_extractor], undef, 1 )
+;
sub my_extractor {
extract_tagged(
$text,
"{{",
"}}",
);
}
for my $infobox (@infoboxes) {
say $infobox;
say '*' x 20;
}
--output:--
{{Infobox
text text text
{{text text text
text {{text text}}
text}}
{{{text {{text }}
text }}}
}}
********************
{{Infobox
text1 text1 text1
{{text1 text1 text1
text1 {{text1 text1}}
text1}}
{{{text1 {{text1 }}
text1 }}}
}}
********************
{{Infobox one}}
********************
Here's the same result using regexes via Regexp::Common:
use strict;
use warnings;
use 5.012;
use Regexp::Common qw( balanced );
my $text = <<'END_OF_STRING';
{{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}}
END_OF_STRING
my $pattern = $RE{ balanced }
{ -begin => '{{' }
{ -end => '}}' };
while ($text =~ /($pattern)/gxms) {
say $1;
say '*' x 20;
}
--output:--
{{Infobox
text text text
{{text text text
text {{text text}}
text}}
{{{text {{text }}
text }}}
}}
********************
{{Infobox
text1 text1 text1
{{text1 text1 text1
text1 {{text1 text1}}
text1}}
{{{text1 {{text1 }}
text1 }}}
}}
********************
{{Infobox one}}
********************