As long as the braces groups are not nested you could do it by separating blocks in a split and handling them differently.
use Data::Dump;
my $data = q|
foo
bar
{{
alpha
beta
}}
baz
|;
@splits = split /({{.*?}})/s, $data;
dd \@splits;
my $result="";
while (my $block = shift @splits) {
$block =~ s/\n/<br>\n/gs;
$result .= $block;
$result .= shift @splits if @splits;
}
print $result;
output
["\nfoo\nbar\n", "{{\nalpha\nbeta\n}}", "\nbaz\n"]
<br>
foo<br>
bar<br>
{{
alpha
beta
}}<br>
baz<br>
I refrain from trying a complicated and potentially unmaintainable one-line regex solution.
Some come to mind¹, but I don't see the necessity if there are no other restrictions (like lack of memory) involved.
UPDATE
¹) like
- looping with while (/({{.*?}})/gs) (and \G and pos)
- using /e to do substitution within substitutions
- complicated look-ahead and look-behind assertion
- using \K somehow to restrict replacement
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|