note
kennethk
<p>It seems odd that you are doing all this in a substitution rather than iterating over the results of the match, <em>e.g.</em> <c>while ($text =~ /$re/g) {...}</c>, particularly given that you are already resorting to some complex activity including an <c>e</c> modifier. However, you could do this in a fell swoop by capturing the entire block you want to reparse, and using a sub-regex in list context w/ the g modifier to return the full list:
<c> $text =~ s/
(.+?) (?:\s*\n)+
((?: \d+ (?:\sPSI)? (?:\s*\n)+ ){4})
/push @r, [ $1, $2 =~ m|\d+ (?:\sPSI)?|xg ]/esgx;
</c>
<p>If I were the maintenance guy that followed you, I would not think friendly thoughts when I saw that.
<p>You could get something a little more maintainable by explicitly expanding your <c>{4}</c> terms:
<c> $text =~ s/
(.+?) (?:\s*\n)+
(?: (\d+ (?:\sPSI)?) (?:\s*\n)+ )
(?: (\d+ (?:\sPSI)?) (?:\s*\n)+ )
(?: (\d+ (?:\sPSI)?) (?:\s*\n)+ )
(?: (\d+ (?:\sPSI)?) (?:\s*\n)+ )
/push @r, [ $1, $2, $3, $4, $5 ]/esgx;
</c>
which could be refactored into
<c> my $sub_re = qr/ (\d+ (?:\sPSI)?) (?:\s*\n)+ /x;
$text =~ s/
(.+?) (?:\s*\n)+
$sub_re
$sub_re
$sub_re
$sub_re
/push @r, [ $1, $2, $3, $4, $5 ]/esgx;
</c>
<p>None of this changes the fact that you have a fundamental obfuscation by using a substitution instead of a loop.
<!-- Node text goes above. Div tags should contain sig only -->
<div class="pmsig"><div class="pmsig-712372">
<hr />
<p>#11929 First ask yourself `How would I do this without a computer?' Then have the computer do it the same way.</p>
</div></div>
1004225
1004225