my $re = qr{\[(?:(?>[^\[\]]+)|(??{$re}))*\]}s; for (;;) { last unless $tempstr =~ s/(\[\w+?\s*=\s*($re|\n|[^\[\]])+\])/&assign($1)/gies; }