📄 switch.html
字号:
<?xml version="1.0" ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<!-- saved from url=(0017)http://localhost/ -->
<script language="JavaScript" src="../displayToc.js"></script>
<script language="JavaScript" src="../tocParas.js"></script>
<script language="JavaScript" src="../tocTab.js"></script>
<link rel="stylesheet" type="text/css" href="../scineplex.css">
<title>Switch - A switch statement for Perl</title>
<link rel="stylesheet" href="../Active.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rev="made" href="mailto:" />
</head>
<body>
<script>writelinks('__top__',1);</script>
<h1><a>Switch - A switch statement for Perl</a></h1>
<p><a name="__index__"></a></p>
<!-- INDEX BEGIN -->
<ul>
<li><a href="#name">NAME</a></li>
<li><a href="#version">VERSION</a></li>
<li><a href="#synopsis">SYNOPSIS</a></li>
<li><a href="#background">BACKGROUND</a></li>
<li><a href="#description">DESCRIPTION</a></li>
<ul>
<li><a href="#allowing_fallthrough">Allowing fall-through</a></li>
<li><a href="#automating_fallthrough">Automating fall-through</a></li>
<li><a href="#alternative_syntax">Alternative syntax</a></li>
<li><a href="#higherorder_operations">Higher-order Operations</a></li>
</ul>
<li><a href="#dependencies">DEPENDENCIES</a></li>
<li><a href="#author">AUTHOR</a></li>
<li><a href="#bugs">BUGS</a></li>
<li><a href="#limitations">LIMITATIONS</a></li>
<li><a href="#copyright">COPYRIGHT</a></li>
</ul>
<!-- INDEX END -->
<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<p>Switch - A switch statement for Perl</p>
<p>
</p>
<hr />
<h1><a name="version">VERSION</a></h1>
<p>This document describes version 2.10 of Switch,
released Dec 29, 2003.</p>
<p>
</p>
<hr />
<h1><a name="synopsis">SYNOPSIS</a></h1>
<pre>
<span class="keyword">use</span> <span class="variable">Switch</span><span class="operator">;</span>
</pre>
<pre>
<span class="variable">switch</span> <span class="operator">(</span><span class="variable">$val</span><span class="operator">)</span> <span class="operator">{</span>
</pre>
<pre>
<span class="variable">case</span> <span class="number">1</span> <span class="operator">{</span> <span class="keyword">print</span> <span class="string">"number 1"</span> <span class="operator">}</span>
<span class="variable">case</span> <span class="string">"a"</span> <span class="operator">{</span> <span class="keyword">print</span> <span class="string">"string a"</span> <span class="operator">}</span>
<span class="variable">case</span> <span class="operator">[</span><span class="number">1</span><span class="operator">..</span><span class="number">10</span><span class="operator">,</span><span class="number">42</span><span class="operator">]</span> <span class="operator">{</span> <span class="keyword">print</span> <span class="string">"number in list"</span> <span class="operator">}</span>
<span class="variable">case</span> <span class="operator">(</span><span class="variable">@array</span><span class="operator">)</span> <span class="operator">{</span> <span class="keyword">print</span> <span class="string">"number in list"</span> <span class="operator">}</span>
<span class="variable">case</span> <span class="operator">/\</span><span class="variable">w</span><span class="operator">+</span><span class="regex">/ { print "pattern" }
case qr/</span><span class="operator">\</span><span class="variable">w</span><span class="operator">+</span><span class="regex">/ { print "pattern" }
case (%hash) { print "entry in hash" }
case (\%hash) { print "entry in hash" }
case (\&sub) { print "arg to subroutine" }
else { print "previous case not true" }
}
</span>
</pre>
<p>
</p>
<hr />
<h1><a name="background">BACKGROUND</a></h1>
<p>[Skip ahead to <a href="#description">DESCRIPTION</a> if you don't care about the whys
and wherefores of this control structure]</p>
<p>In seeking to devise a "Swiss Army" case mechanism suitable for Perl,
it is useful to generalize this notion of distributed conditional
testing as far as possible. Specifically, the concept of "matching"
between the switch value and the various case values need not be
restricted to numeric (or string or referential) equality, as it is in other
languages. Indeed, as Table 1 illustrates, Perl
offers at least eighteen different ways in which two values could
generate a match.</p>
<pre>
Table 1: Matching a switch value ($s) with a case value ($c)</pre>
<pre>
Switch Case Type of Match Implied Matching Code
Value Value
====== ===== ===================== =============</pre>
<pre>
<span class="variable">number</span> <span class="variable">same</span> <span class="variable">numeric</span> <span class="keyword">or</span> <span class="variable">referential</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">$s</span> <span class="operator">==</span> <span class="variable">$c</span><span class="operator">;</span>
<span class="keyword">or</span> <span class="keyword">ref</span> <span class="variable">equality</span>
</pre>
<pre>
<span class="variable">object</span> <span class="variable">method</span> <span class="variable">result</span> <span class="variable">of</span> <span class="variable">method</span> <span class="variable">call</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">$s</span><span class="operator">-></span><span class="variable">$c</span><span class="operator">();</span>
<span class="keyword">ref</span> <span class="variable">name</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="keyword">defined</span> <span class="variable">$s</span><span class="operator">-></span><span class="variable">$c</span><span class="operator">();</span>
<span class="keyword">or</span> <span class="keyword">ref</span>
</pre>
<pre>
<span class="variable">other</span> <span class="variable">other</span> <span class="variable">string</span> <span class="variable">equality</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">$s</span> <span class="keyword">eq</span> <span class="variable">$c</span><span class="operator">;</span>
<span class="variable">non</span><span class="operator">-</span><span class="keyword">ref</span> <span class="variable">non</span><span class="operator">-</span><span class="keyword">ref</span>
<span class="keyword">scalar</span> <span class="keyword">scalar</span>
</pre>
<pre>
<span class="variable">string</span> <span class="variable">regexp</span> <span class="variable">pattern</span> <span class="variable">match</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">$s</span> <span class="operator">=~</span> <span class="regex">/$c/</span><span class="operator">;</span>
</pre>
<pre>
<span class="variable">array</span> <span class="keyword">scalar</span> <span class="variable">array</span> <span class="variable">entry</span> <span class="variable">existence</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="number">0</span><span class="operator"><=</span><span class="variable">$c</span> <span class="operator">&&</span> <span class="variable">$c</span><span class="operator"><</span><span class="variable">@$s</span><span class="operator">;</span>
<span class="keyword">ref</span> <span class="variable">array</span> <span class="variable">entry</span> <span class="variable">definition</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="keyword">defined</span> <span class="variable">$s</span><span class="operator">-></span><span class="operator">[</span><span class="variable">$c</span><span class="operator">]</span><span class="operator">;</span>
<span class="variable">array</span> <span class="variable">entry</span> <span class="variable">truth</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">$s</span><span class="operator">-></span><span class="operator">[</span><span class="variable">$c</span><span class="operator">]</span><span class="operator">;</span>
</pre>
<pre>
<span class="variable">array</span> <span class="variable">array</span> <span class="variable">array</span> <span class="variable">intersection</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">intersects</span><span class="operator">(</span><span class="variable">@$s</span><span class="operator">,</span> <span class="variable">@$c</span><span class="operator">);</span>
<span class="keyword">ref</span> <span class="keyword">ref</span> <span class="operator">(</span><span class="variable">apply</span> <span class="variable">this</span> <span class="variable">table</span> <span class="variable">to</span>
<span class="variable">all</span> <span class="variable">pairs</span> <span class="variable">of</span> <span class="variable">elements</span>
<span class="variable">$s</span><span class="operator">-></span><span class="operator">[</span><span class="variable">$i</span><span class="operator">]</span> <span class="keyword">and</span>
<span class="variable">$c</span><span class="operator">-></span><span class="operator">[</span><span class="variable">$j</span><span class="operator">]</span><span class="operator">)</span>
</pre>
<pre>
<span class="variable">array</span> <span class="variable">regexp</span> <span class="variable">array</span> <span class="keyword">grep</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="keyword">grep</span> <span class="regex">/$c/</span><span class="operator">,</span> <span class="variable">@$s</span><span class="operator">;</span>
<span class="keyword">ref</span>
</pre>
<pre>
<span class="variable">hash</span> <span class="keyword">scalar</span> <span class="variable">hash</span> <span class="variable">entry</span> <span class="variable">existence</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="keyword">exists</span> <span class="variable">$s</span><span class="operator">-></span><span class="operator">{</span><span class="variable">$c</span><span class="operator">}</span><span class="operator">;</span>
<span class="keyword">ref</span> <span class="variable">hash</span> <span class="variable">entry</span> <span class="variable">definition</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="keyword">defined</span> <span class="variable">$s</span><span class="operator">-></span><span class="operator">{</span><span class="variable">$c</span><span class="operator">}</span><span class="operator">;</span>
<span class="variable">hash</span> <span class="variable">entry</span> <span class="variable">truth</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">$s</span><span class="operator">-></span><span class="operator">{</span><span class="variable">$c</span><span class="operator">}</span><span class="operator">;</span>
</pre>
<pre>
<span class="variable">hash</span> <span class="variable">regexp</span> <span class="variable">hash</span> <span class="keyword">grep</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="keyword">grep</span> <span class="regex">/$c/</span><span class="operator">,</span> <span class="keyword">keys</span> <span class="variable">%$s</span><span class="operator">;</span>
<span class="keyword">ref</span>
</pre>
<pre>
<span class="keyword">sub</span><span class="variable"> scalar return value defn match if defined $s-></span><span class="operator">(</span>$c<span class="operator">);</span>
<span class="keyword">ref</span> <span class="keyword">return</span> <span class="variable">value</span> <span class="variable">truth</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">$s</span><span class="operator">->(</span><span class="variable">$c</span><span class="operator">);</span>
</pre>
<pre>
<span class="keyword">sub</span><span class="variable"> array return value defn match if defined $s-></span><span class="operator">(</span>@$c<span class="operator">);</span>
<span class="keyword">ref</span> <span class="keyword">ref</span> <span class="keyword">return</span> <span class="variable">value</span> <span class="variable">truth</span> <span class="variable">match</span> <span class="keyword">if</span> <span class="variable">$s</span><span class="operator">->(</span><span class="variable">@$c</span><span class="operator">);</span>
</pre>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -