⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 switch.html

📁 perl教程
💻 HTML
📖 第 1 页 / 共 3 页
字号:
                <span class="variable">case</span> <span class="number">1</span>      <span class="operator">{</span> <span class="variable">handle_num_1</span><span class="operator">();</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="string">"1"</span>    <span class="operator">{</span> <span class="variable">handle_str_1</span><span class="operator">();</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="operator">[</span><span class="number">0</span><span class="operator">..</span><span class="number">9</span><span class="operator">]</span> <span class="operator">{</span> <span class="variable">handle_num_any</span><span class="operator">();</span> <span class="keyword">last</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="operator">/\</span><span class="variable">d</span><span class="operator">/</span>   <span class="operator">{</span> <span class="variable">handle_dig_any</span><span class="operator">();</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="operator">/.*</span><span class="regex">/   { handle_str_any(); }
        }
        </span>
</pre>
<p>Note the explicit use of a <a href="../lib/Pod/perlfunc.html#item_last"><code>last</code></a> to preserve the non-fall-through
behaviour of the third case.</p>
<p>
</p>
<h2><a name="alternative_syntax">Alternative syntax</a></h2>
<p>Perl 6 will provide a built-in switch statement with essentially the
same semantics as those offered by Switch.pm, but with a different
pair of keywords. In Perl 6 <code>switch</code> will be spelled <code>given</code>, and
<code>case</code> will be pronounced <code>when</code>. In addition, the <code>when</code> statement
will not require switch or case values to be parenthesized.</p>
<p>This future syntax is also (largely) available via the Switch.pm module, by
importing it with the argument <code>&quot;Perl6&quot;</code>.  For example:</p>
<pre>
        <span class="keyword">use</span> <span class="variable">Switch</span> <span class="string">'Perl6'</span><span class="operator">;</span>
</pre>
<pre>
        <span class="variable">given</span> <span class="operator">(</span><span class="variable">$val</span><span class="operator">)</span> <span class="operator">{</span>
                <span class="variable">when</span> <span class="number">1</span>       <span class="operator">{</span> <span class="variable">handle_num_1</span><span class="operator">();</span> <span class="operator">}</span>
                <span class="variable">when</span> <span class="operator">(</span><span class="variable">$str1</span><span class="operator">)</span> <span class="operator">{</span> <span class="variable">handle_str_1</span><span class="operator">();</span> <span class="operator">}</span>
                <span class="variable">when</span> <span class="operator">[</span><span class="number">0</span><span class="operator">..</span><span class="number">9</span><span class="operator">]</span>  <span class="operator">{</span> <span class="variable">handle_num_any</span><span class="operator">();</span> <span class="keyword">last</span> <span class="operator">}</span>
                <span class="variable">when</span> <span class="operator">/\</span><span class="variable">d</span><span class="operator">/</span>    <span class="operator">{</span> <span class="variable">handle_dig_any</span><span class="operator">();</span> <span class="operator">}</span>
                <span class="variable">when</span> <span class="operator">/.*</span><span class="regex">/    { handle_str_any(); }
                default      { handle anything else; }
        }
        </span>
</pre>
<p>Note that scalars still need to be parenthesized, since they would be
ambiguous in Perl 5.</p>
<p>Note too that you can mix and match both syntaxes by importing the module
with:</p>
<pre>
        <span class="keyword">use</span> <span class="variable">Switch</span> <span class="string">'Perl5'</span><span class="operator">,</span> <span class="string">'Perl6'</span><span class="operator">;</span>
</pre>
<p>
</p>
<h2><a name="higherorder_operations">Higher-order Operations</a></h2>
<p>One situation in which <code>switch</code> and <code>case</code> do not provide a good
substitute for a cascaded <code>if</code>, is where a switch value needs to
be tested against a series of conditions. For example:</p>
<pre>
        <span class="keyword">sub</span><span class="variable"> beverage </span><span class="operator">{</span>
            <span class="variable">switch</span> <span class="operator">(</span><span class="keyword">shift</span><span class="operator">)</span> <span class="operator">{</span>
</pre>
<pre>
                <span class="variable">case</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">&lt;</span> <span class="number">10</span> <span class="operator">}</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'milk'</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">&lt;</span> <span class="number">20</span> <span class="operator">}</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'coke'</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">&lt;</span> <span class="number">30</span> <span class="operator">}</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'beer'</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">&lt;</span> <span class="number">40</span> <span class="operator">}</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'wine'</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">&lt;</span> <span class="number">50</span> <span class="operator">}</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'malt'</span> <span class="operator">}</span>
                <span class="variable">case</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">&lt;</span> <span class="number">60</span> <span class="operator">}</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'Moet'</span> <span class="operator">}</span>
                <span class="keyword">else</span>                     <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'milk'</span> <span class="operator">}</span>
                            <span class="operator">}</span>
                        <span class="operator">}</span>
</pre>
<p>The need to specify each condition as a subroutine block is tiresome. To
overcome this, when importing Switch.pm, a special &quot;placeholder&quot;
subroutine named <code>__</code> [sic] may also be imported. This subroutine
converts (almost) any expression in which it appears to a reference to a
higher-order function. That is, the expression:</p>
<pre>
        <span class="keyword">use</span> <span class="variable">Switch</span> <span class="string">'__'</span><span class="operator">;</span>
</pre>
<pre>
        __ &lt; 2 + __</pre>
<p>is equivalent to:</p>
<pre>
        <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">&lt;</span> <span class="number">2</span> <span class="operator">+</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">1</span><span class="operator">]</span> <span class="operator">}</span>
</pre>
<p>With <code>__</code>, the previous ugly case statements can be rewritten:</p>
<pre>
        <span class="variable">case</span>  <span class="variable">__</span> <span class="operator">&lt;</span> <span class="number">10</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'milk'</span> <span class="operator">}</span>
        <span class="variable">case</span>  <span class="variable">__</span> <span class="operator">&lt;</span> <span class="number">20</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'coke'</span> <span class="operator">}</span>
        <span class="variable">case</span>  <span class="variable">__</span> <span class="operator">&lt;</span> <span class="number">30</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'beer'</span> <span class="operator">}</span>
        <span class="variable">case</span>  <span class="variable">__</span> <span class="operator">&lt;</span> <span class="number">40</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'wine'</span> <span class="operator">}</span>
        <span class="variable">case</span>  <span class="variable">__</span> <span class="operator">&lt;</span> <span class="number">50</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'malt'</span> <span class="operator">}</span>
        <span class="variable">case</span>  <span class="variable">__</span> <span class="operator">&lt;</span> <span class="number">60</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'Moet'</span> <span class="operator">}</span>
        <span class="keyword">else</span>           <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'milk'</span> <span class="operator">}</span>
</pre>
<p>The <code>__</code> subroutine makes extensive use of operator overloading to
perform its magic. All operations involving __ are overloaded to
produce an anonymous subroutine that implements a lazy version
of the original operation.</p>
<p>The only problem is that operator overloading does not allow the
boolean operators <code>&amp;&amp;</code> and <code>||</code> to be overloaded. So a case statement
like this:</p>
<pre>
        <span class="variable">case</span>  <span class="number">0</span> <span class="operator">&lt;=</span> <span class="variable">__</span> <span class="operator">&amp;&amp;</span> <span class="variable">__</span> <span class="operator">&lt;</span> <span class="number">10</span>  <span class="operator">{</span> <span class="keyword">return</span> <span class="string">'digit'</span> <span class="operator">}</span>
</pre>
<p>doesn't act as expected, because when it is
executed, it constructs two higher order subroutines
and then treats the two resulting references as arguments to <code>&amp;&amp;</code>:</p>
<pre>
        <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="number">0</span> <span class="operator">&lt;=</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">}</span> <span class="operator">&amp;&amp;</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span> <span class="variable">$_</span><span class="operator">[</span><span class="number">0</span><span class="operator">]</span> <span class="operator">&lt;</span> <span class="number">10</span> <span class="operator">}</span>
</pre>
<p>This boolean expression is inevitably true, since both references are
non-false. Fortunately, the overloaded <code>'bool'</code> operator catches this
situation and flags it as a error.</p>
<p>
</p>
<hr />
<h1><a name="dependencies">DEPENDENCIES</a></h1>
<p>The module is implemented using Filter::Util::Call and Text::Balanced
and requires both these modules to be installed.</p>
<p>
</p>
<hr />
<h1><a name="author">AUTHOR</a></h1>
<p>Damian Conway (<a href="mailto:damian@conway.org">damian@conway.org</a>) The maintainer of this module is now Rafael
Garcia-Suarez (<a href="mailto:rgarciasuarez@free.fr">rgarciasuarez@free.fr</a>)</p>
<p>
</p>
<hr />
<h1><a name="bugs">BUGS</a></h1>
<p>There are undoubtedly serious bugs lurking somewhere in code this funky :-)
Bug reports and other feedback are most welcome.</p>
<p>
</p>
<hr />
<h1><a name="limitations">LIMITATIONS</a></h1>
<p>Due to the heuristic nature of Switch.pm's source parsing, the presence
of regexes specified with raw <code>?...?</code> delimiters may cause mysterious
errors. The workaround is to use <code>m?...?</code> instead.</p>
<p>Due to the way source filters work in Perl, you can't use Switch inside
an string <a href="../lib/Pod/perlfunc.html#item_eval"><code>eval</code></a>.</p>
<p>If your source file is longer then 1 million characters and you have a
switch statement that crosses the 1 million (or 2 million, etc.)
character boundary you will get mysterious errors. The workaround is to
use smaller source files.</p>
<p>
</p>
<hr />
<h1><a name="copyright">COPYRIGHT</a></h1>
<pre>
    Copyright (c) 1997-2003, Damian Conway. All Rights Reserved.
    This module is free software. It may be used, redistributed
        and/or modified under the same terms as Perl itself.
</pre>

</body>

</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -