simple.html
来自「perl教程」· HTML 代码 · 共 601 行 · 第 1/3 页
HTML
601 行
<p>In other words, the previous example, would become:</p>
<pre>
<span class="keyword">package</span> <span class="variable">BANG</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="variable">Filter::Simple</span><span class="operator">;</span>
<span class="variable">FILTER</span> <span class="operator">{</span>
<span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span><span class="operator">;</span>
<span class="operator">};</span>
</pre>
<pre>
<span class="number">1</span> <span class="operator">;</span>
</pre>
<p>Note that the source code is passed as a single string, so any regex that
uses <code>^</code> or <code>$</code> to detect line boundaries will need the <code>/m</code> flag.</p>
<p>
</p>
<h2><a name="disabling_or_changing__no__behaviour">Disabling or changing <no> behaviour</a></h2>
<p>By default, the installed filter only filters up to a line consisting of one of
the three standard source "terminators":</p>
<pre>
<span class="keyword">no</span> <span class="variable">ModuleName</span><span class="operator">;</span> <span class="comment"># optional comment</span>
</pre>
<p>or:</p>
<pre>
__END__</pre>
<p>or:</p>
<pre>
__DATA__</pre>
<p>but this can be altered by passing a second argument to <code>use Filter::Simple</code>
or <code>FILTER</code> (just remember: there's <em>no</em> comma after the initial block when
you use <code>FILTER</code>).</p>
<p>That second argument may be either a <code>qr</code>'d regular expression (which is then
used to match the terminator line), or a defined false value (which indicates
that no terminator line should be looked for), or a reference to a hash
(in which case the terminator is the value associated with the key
<code>'terminator'</code>.</p>
<p>For example, to cause the previous filter to filter only up to a line of the
form:</p>
<pre>
<span class="variable">GNAB</span> <span class="variable">esu</span><span class="operator">;</span>
</pre>
<p>you would write:</p>
<pre>
<span class="keyword">package</span> <span class="variable">BANG</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="variable">Filter::Simple</span><span class="operator">;</span>
<span class="variable">FILTER</span> <span class="operator">{</span>
<span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span><span class="operator">;</span>
<span class="operator">}</span>
<span class="string">qr/^\s*GNAB\s+esu\s*;\s*?$/</span><span class="operator">;</span>
</pre>
<p>or:</p>
<pre>
<span class="variable">FILTER</span> <span class="operator">{</span>
<span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span><span class="operator">;</span>
<span class="operator">}</span>
<span class="operator">{</span> <span class="string">terminator</span> <span class="operator">=></span> <span class="string">qr/^\s*GNAB\s+esu\s*;\s*?$/</span> <span class="operator">}</span><span class="operator">;</span>
</pre>
<p>and to prevent the filter's being turned off in any way:</p>
<pre>
<span class="keyword">package</span> <span class="variable">BANG</span><span class="operator">;</span>
<span class="keyword">use</span> <span class="variable">Filter::Simple</span><span class="operator">;</span>
<span class="variable">FILTER</span> <span class="operator">{</span>
<span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span><span class="operator">;</span>
<span class="operator">}</span>
<span class="string">""</span><span class="operator">;</span> <span class="comment"># or: 0</span>
</pre>
<p>or:</p>
<pre>
<span class="variable">FILTER</span> <span class="operator">{</span>
<span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span><span class="operator">;</span>
<span class="operator">}</span>
<span class="operator">{</span> <span class="string">terminator</span> <span class="operator">=></span> <span class="string">""</span> <span class="operator">}</span><span class="operator">;</span>
</pre>
<p><strong>Note that, no matter what you set the terminator pattern to,
the actual terminator itself <em>must</em> be contained on a single source line.</strong></p>
<p>
</p>
<h2><a name="allinone_interface">All-in-one interface</a></h2>
<p>Separating the loading of Filter::Simple:</p>
<pre>
<span class="keyword">use</span> <span class="variable">Filter::Simple</span><span class="operator">;</span>
</pre>
<p>from the setting up of the filtering:</p>
<pre>
<span class="variable">FILTER</span> <span class="operator">{</span> <span class="operator">...</span> <span class="operator">};</span>
</pre>
<p>is useful because it allows other code (typically parser support code
or caching variables) to be defined before the filter is invoked.
However, there is often no need for such a separation.</p>
<p>In those cases, it is easier to just append the filtering subroutine and
any terminator specification directly to the <a href="../../lib/Pod/perlfunc.html#item_use"><code>use</code></a> statement that loads
Filter::Simple, like so:</p>
<pre>
<span class="keyword">use</span> <span class="variable">Filter::Simple</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span>
<span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span><span class="operator">;</span>
<span class="operator">};</span>
</pre>
<p>This is exactly the same as:</p>
<pre>
<span class="keyword">use</span> <span class="variable">Filter::Simple</span><span class="operator">;</span>
<span class="keyword">BEGIN</span> <span class="operator">{</span>
<span class="variable">Filter::Simple::FILTER</span> <span class="operator">{</span>
<span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span><span class="operator">;</span>
<span class="operator">};</span>
<span class="operator">}</span>
</pre>
<p>except that the <code>FILTER</code> subroutine is not exported by Filter::Simple.</p>
<p>
</p>
<h2><a name="filtering_only_specific_components_of_source_code">Filtering only specific components of source code</a></h2>
<p>One of the problems with a filter like:</p>
<pre>
<span class="keyword">use</span> <span class="variable">Filter::Simple</span><span class="operator">;</span>
</pre>
<pre>
<span class="variable">FILTER</span> <span class="operator">{</span> <span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span> <span class="operator">};</span>
</pre>
<p>is that it indiscriminately applies the specified transformation to
the entire text of your source program. So something like:</p>
<pre>
warn 'BANG BANG, YOU'RE DEAD';
BANG BANG;</pre>
<p>will become:</p>
<pre>
warn 'die 'BANG' if $BANG, YOU'RE DEAD';
die 'BANG' if $BANG;</pre>
<p>It is very common when filtering source to only want to apply the filter
to the non-character-string parts of the code, or alternatively to <em>only</em>
the character strings.</p>
<p>Filter::Simple supports this type of filtering by automatically
exporting the <code>FILTER_ONLY</code> subroutine.</p>
<p><code>FILTER_ONLY</code> takes a sequence of specifiers that install separate
(and possibly multiple) filters that act on only parts of the source code.
For example:</p>
<pre>
<span class="keyword">use</span> <span class="variable">Filter::Simple</span><span class="operator">;</span>
</pre>
<pre>
<span class="variable">FILTER_ONLY</span>
<span class="string">code</span> <span class="operator">=></span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="regex">s/BANG\s+BANG/die 'BANG' if \$BANG/g</span> <span class="operator">},</span>
<span class="string">quotelike</span> <span class="operator">=></span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="regex">s/BANG\s+BANG/CHITTY CHITTY/g</span> <span class="operator">};</span>
</pre>
<p>The <a href="#item__22code_22"><code>"code"</code></a> subroutine will only be used to filter parts of the source
code that are not quotelikes, POD, or <code>__DATA__</code>. The <code>quotelike</code>
subroutine only filters Perl quotelikes (including here documents).</p>
<p>The full list of alternatives is:</p>
<dl>
<dt><strong><a name="item__22code_22"><code>"code"</code></a></strong>
<dd>
<p>Filters only those sections of the source code that are not quotelikes, POD, or
<code>__DATA__</code>.</p>
</dd>
</li>
<dt><strong><a name="item__22code_no_comments_22"><code>"code_no_comments"</code></a></strong>
<dd>
<p>Filters only those sections of the source code that are not quotelikes, POD,
comments, or <code>__DATA__</code>.</p>
</dd>
</li>
<dt><strong><a name="item__22executable_22"><code>"executable"</code></a></strong>
<dd>
<p>Filters only those sections of the source code that are not POD or <code>__DATA__</code>.</p>
</dd>
</li>
<dt><strong><a name="item__22executable_no_comments_22"><code>"executable_no_comments"</code></a></strong>
<dd>
<p>Filters only those sections of the source code that are not POD, comments, or <code>__DATA__</code>.</p>
</dd>
</li>
<dt><strong><a name="item__22quotelike_22"><code>"quotelike"</code></a></strong>
<dd>
<p>Filters only Perl quotelikes (as interpreted by
<code>&Text::Balanced::extract_quotelike</code>).</p>
</dd>
</li>
<dt><strong><a name="item__22string_22"><code>"string"</code></a></strong>
<dd>
<p>Filters only the string literal parts of a Perl quotelike (i.e. the
contents of a string literal, either half of a <a href="../../lib/Pod/perlfunc.html#item_tr_"><code>tr///</code></a>, the second
half of an <a href="../../lib/Pod/perlfunc.html#item_s_"><code>s///</code></a>).</p>
</dd>
</li>
<dt><strong><a name="item__22regex_22"><code>"regex"</code></a></strong>
<dd>
<p>Filters only the pattern literal parts of a Perl quotelike (i.e. the
contents of a <a href="../../lib/Pod/perlfunc.html#item_qr_"><code>qr//</code></a> or an <a href="../../lib/Pod/perlfunc.html#item_m_"><code>m//</code></a>, the first half of an <a href="../../lib/Pod/perlfunc.html#item_s_"><code>s///</code></a>).</p>
</dd>
</li>
<dt><strong><a name="item__22all_22"><code>"all"</code></a></strong>
<dd>
<p>Filters everything. Identical in effect to <code>FILTER</code>.</p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?