|
/Users/cpanrun/depot/main/contrib-patched/perl/CPAN/src/Regexp-Subst-Parallel/blib/html/site/lib/Regexp/Subst/Parallel.html |
<span class="comment"># Apply implicit html highlighting</span>
<span class="keyword">my</span> <span class="variable">$html</span> <span class="operator">=</span> <span class="variable">subst</span><span class="operator">(</span><span class="variable">$text</span><span class="operator">,</span>
<span class="string">qr/\{(.*?)\}/</span> <span class="operator">=></span> <span class="string">'$1'</span><span class="operator">,</span> <span class="comment"># Protect things in braces</span>
<span class="string">qr/_(\w+)_/</span> <span class="operator">=></span> <span class="string">'<u>$1</u>'</span><span class="operator">,</span>
<span class="string">qr/<(\w+)>/</span> <span class="operator">=></span> <span class="string">'<i>$1</i>'</span><span class="operator">,</span>
<span class="operator">);</span>
</pre>
<pre>
<span class="comment"># Toggle the case of every character</span>
<span class="keyword">my</span> <span class="variable">$vAR</span> <span class="operator">=</span> <span class="variable">subst</span><span class="operator">(</span><span class="variable">$Var</span><span class="operator">,</span>
<span class="string">qr/([a-z]+)/</span> <span class="operator">=></span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="keyword">uc</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">1</span><span class="operator">]</span> <span class="operator">},</span>
<span class="string">qr/([A-Z]+)/</span> <span class="operator">=></span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="keyword">lc</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">1</span><span class="operator">]</span> <span class="operator">},</span>
<span class="operator">);</span>
</pre>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p><code>Regexp::Subst::Parallel</code> is a module that allows you to make
multiple simultaneous substitutions safely. Using the sole exported
<code>subst</code> function has a rather different effect from doing each
substitution sequentially. For example:</p>
<pre>
<span class="variable">$text</span> <span class="operator">=</span> <span class="string">'{process_the_data} was _called_ without <data>!'</span><span class="operator">;</span>
<span class="variable">$text</span> <span class="operator">=~</span> <span class="regex">s/\{(.*?)\}/$1/g</span><span class="operator">;</span>
<span class="comment"># $text eq 'process_the_data was _called_ without <data>!'</span>
<span class="variable">$text</span> <span class="operator">=~</span> <span class="regex">s/_(\w+)_/<u>$1</u</span><span class="operator">></span><span class="regex">/g;
# </span><span class="variable">$text</span><span class="regex"> eq 'process<u>the</u</span><span class="operator">></span><span class="variable">data</span> <span class="variable">was</span> <span class="operator"><</span><span class="variable">u</span><span class="operator">></span><span class="variable">called</span><span class="operator"></</span><span class="variable">u</span><span class="operator">></span> <span class="variable">without</span> <span class="operator"><</span><span class="variable">data</span><span class="operator">>!</span><span class="string">'
$text =~ s/<(\w+)>/<i>$1</i>/g;
# $text eq '</span><span class="variable">process</span><span class="operator"><</span><span class="variable">i</span><span class="operator">></span><span class="variable">u</span><span class="operator"></</span><span class="variable">i</span><span class="operator">></span><span class="variable">the</span><span class="operator"></</span><span class="variable">u</span><span class="operator">></span><span class="variable">data</span> <span class="variable">was</span> <span class="operator"><</span><span class="variable">i</span><span class="operator">></span><span class="variable">u</span><span class="operator"></</span><span class="variable">i</span><span class="operator">></span><span class="variable">called</span><span class="operator"></</span><span class="variable">u</span><span class="operator">></span> <span class="variable">without</span> <span class="operator"><</span><span class="variable">i</span><span class="operator">></span><span class="variable">data</span><span class="operator"></</span><span class="variable">i</span><span class="operator">>!</span><span class="string">'
</span>
</pre>
<p>Which is clearly the wrong result. On the other hand,
<code>Regexp::Subst::Parallel</code> does them all in parallel, so:</p>
<pre>
<span class="variable">$text</span> <span class="operator">=</span> <span class="string">'{process_the_data} was _called_ without <data>!'</span><span class="operator">;</span>
<span class="variable">$text</span> <span class="operator">=</span> <span class="variable">subst</span><span class="operator">(</span><span class="variable">$text</span><span class="operator">,</span>
<span class="string">qr/\{(.*?)\}/</span> <span class="operator">=></span> <span class="string">'$1'</span><span class="operator">,</span> <span class="comment"># Protect things in braces</span>
<span class="string">qr/_(\w+)_/</span> <span class="operator">=></span> <span class="string">'<u>$1</u>'</span><span class="operator">,</span>
<span class="string">qr/<(\w+)>/</span> <span class="operator">=></span> <span class="string">'<i>$1</i>'</span><span class="operator">,</span>
<span class="operator">);</span>
<span class="comment"># $text eq 'process_the_data was <u>called</u> without <i>data</i>'</span>
</pre>
<p>Which seems to be right.</p>
<p>The algorithm moves from left to right, and the longest match is
substituted in case of conflict. The substitution side of the pairs
can either be a string, in which non-backslashed $n's are substituted,
or a coderef, in which the sub is called and passed the list of
captures in @_. $_[0] is analogous to $& : it refers to the entire
match.</p>
<p>
</p>
<h2><a name="gotchas">Gotchas</a></h2>
<p>Make sure when you're using the string method to have the $'s included
in the string. That means if you're using an interpolating quote ("",
qq{}, etc.) that you backslash $1, $2, etc. Otherwise you will get
the $n's from the current lexical scope, which is not what you want.</p>
<p>
</p>
<h2><a name="caveats">Caveats</a></h2>
<p>To include a single backslash followed by an interpolated capture,
<code>subst</code> needs to see '\\$1', which means that you have to type
'\\\\$1' when you just want <em>a single backslash</em>. That's sick.</p>
<p>
</p>
<hr />
<h1><a name="authors">AUTHORS</a></h1>
<p>Luke Palmer <<a href="mailto:fibonaci@babylonia.flatirons.org">fibonaci@babylonia.flatirons.org</a>></p>
<p>
</p>
<hr />
<h1><a name="copyright">COPYRIGHT</a></h1>
<p>Copyright (C) 2003 Luke Palmer. This module is distributed under the
same terms as Perl itself.</p>
<pre>
<a href="http://www.perl.com/perl/misc/Artistic.html">http://www.perl.com/perl/misc/Artistic.html</a>
</pre>
</body>
</html>
|
/Users/cpanrun/depot/main/contrib-patched/perl/CPAN/src/Regexp-Subst-Parallel/blib/html/site/lib/Regexp/Subst/Parallel.html |