watch.html

来自「perl教程」· HTML 代码 · 共 295 行 · 第 1/2 页

HTML
295
字号
<?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>Tie::Watch - place watchpoints on Perl variables.</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__',2);</script>
<h1><a>Tie::Watch - place watchpoints on Perl variables.</a></h1>
<p><a name="__index__"></a></p>

<!-- INDEX BEGIN -->

<ul>

	<li><a href="#name">NAME</a></li>
	<li><a href="#synopsis">SYNOPSIS</a></li>
	<li><a href="#description">DESCRIPTION</a></li>
	<li><a href="#methods">METHODS</a></li>
	<li><a href="#efficiency_considerations">EFFICIENCY CONSIDERATIONS</a></li>
	<li><a href="#author">AUTHOR</a></li>
	<li><a href="#history">HISTORY</a></li>
	<li><a href="#copyright">COPYRIGHT</a></li>
</ul>
<!-- INDEX END -->

<hr />
<p>
</p>
<h1><a name="name">NAME</a></h1>
<pre>
 Tie::Watch - place watchpoints on Perl variables.</pre>
<p>
</p>
<hr />
<h1><a name="synopsis">SYNOPSIS</a></h1>
<pre>
 <span class="keyword">use</span> <span class="variable">Tie::Watch</span><span class="operator">;</span>
</pre>
<pre>
 <span class="variable">$watch</span> <span class="operator">=</span> <span class="variable">Tie::Watch</span><span class="operator">-&gt;</span><span class="variable">new</span><span class="operator">(</span>
     <span class="string">-variable</span> <span class="operator">=&gt;</span> <span class="operator">\</span><span class="variable">$frog</span><span class="operator">,</span>
     <span class="string">-debug</span>    <span class="operator">=&gt;</span> <span class="number">1</span><span class="operator">,</span>
     <span class="string">-shadow</span>   <span class="operator">=&gt;</span> <span class="number">0</span><span class="operator">,</span>
     <span class="string">-fetch</span>    <span class="operator">=&gt;</span> <span class="operator">[</span><span class="operator">\&amp;</span><span class="variable">fetch</span><span class="operator">,</span> <span class="string">'arg1'</span><span class="operator">,</span> <span class="string">'arg2'</span><span class="operator">,</span> <span class="operator">...,</span> <span class="string">'argn'</span><span class="operator">]</span><span class="operator">,</span>
     <span class="string">-store</span>    <span class="operator">=&gt;</span> <span class="operator">\&amp;</span><span class="variable">store</span><span class="operator">,</span>
     <span class="string">-destroy</span>  <span class="operator">=&gt;</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span><span class="keyword">print</span> <span class="string">"Final value=$frog.\n"</span><span class="operator">},</span>
 <span class="operator">}</span>
 <span class="variable">%vinfo</span> <span class="operator">=</span> <span class="variable">$watch</span><span class="operator">-&gt;</span><span class="variable">Info</span><span class="operator">;</span>
 <span class="variable">$args</span>  <span class="operator">=</span> <span class="variable">$watch</span><span class="operator">-&gt;</span><span class="variable">Args</span><span class="operator">(-</span><span class="variable">fetch</span><span class="operator">);</span>
 <span class="variable">$val</span>   <span class="operator">=</span> <span class="variable">$watch</span><span class="operator">-&gt;</span><span class="variable">Fetch</span><span class="operator">;</span>
 <span class="keyword">print</span> <span class="string">"val="</span><span class="operator">,</span> <span class="variable">$watch</span><span class="operator">-&gt;</span><span class="variable">Say</span><span class="operator">(</span><span class="variable">$val</span><span class="operator">),</span> <span class="string">".\n"</span><span class="operator">;</span>
 <span class="variable">$watch</span><span class="operator">-&gt;</span><span class="variable">Store</span><span class="operator">(</span><span class="string">'Hello'</span><span class="operator">);</span>
 <span class="variable">$watch</span><span class="operator">-&gt;</span><span class="variable">Unwatch</span><span class="operator">;</span>
</pre>
<p>
</p>
<hr />
<h1><a name="description">DESCRIPTION</a></h1>
<p>This class module binds one or more subroutines of your devising to a
Perl variable.  All variables can have <strong>FETCH</strong>, <strong>STORE</strong> and
<strong>DESTROY</strong> callbacks.  Additionally, arrays can define <strong>CLEAR</strong>, <strong>EXTEND</strong>,
<strong>FETCHSIZE</strong>, <strong>POP</strong>, <strong>PUSH</strong>, <strong>SHIFT</strong>, <strong>SPLICE</strong>, <strong>STORESIZE</strong> and
<strong>UNSHIFT</strong> callbacks, and hashes can define <strong>CLEAR</strong>, <strong>DELETE</strong>, <strong>EXISTS</strong>,
<strong>FIRSTKEY</strong> and <strong>NEXTKEY</strong> callbacks.  If these term are unfamiliar to you,
I <em>really</em> suggest you read <a href="../../lib/Pod/perltie.html">the perltie manpage</a>.</p>
<p>With Tie::Watch you can:</p>
<pre>
 . alter a variable's value
 . prevent a variable's value from being changed
 . invoke a Perl/Tk callback when a variable changes
 . trace references to a variable</pre>
<p>Callback format is patterned after the Perl/Tk scheme: supply either a
code reference, or, supply an array reference and pass the callback
code reference in the first element of the array, followed by callback
arguments.  (See examples in the Synopsis, above.)</p>
<p>Tie::Watch provides default callbacks for any that you fail to
specify.  Other than negatively impacting performance, they perform
the standard action that you'd expect, so the variable behaves
&quot;normally&quot;.  Once you override a default callback, perhaps to insert
debug code like print statements, your callback normally finishes by
calling the underlying (overridden) method.  But you don't have to!</p>
<p>To map a tied method name to a default callback name simply lowercase
the tied method name and uppercase its first character.  So FETCH
becomes Fetch, NEXTKEY becomes Nextkey, etcetera.</p>
<p>Here are two callbacks for a scalar. The <strong>FETCH</strong> (read) callback does
nothing other than illustrate the fact that it returns the value to
assign the variable.  The <strong>STORE</strong> (write) callback uppercases the
variable and returns it.  In all cases the callback <em>must</em> return the
correct read or write value - typically, it does this by invoking the
underlying method.</p>
<pre>
 <span class="keyword">my</span> <span class="variable">$fetch_scalar</span> <span class="operator">=</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span>
     <span class="keyword">my</span><span class="operator">(</span><span class="variable">$self</span><span class="operator">)</span> <span class="operator">=</span> <span class="variable">@_</span><span class="operator">;</span>
     <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Fetch</span><span class="operator">;</span>
 <span class="operator">};</span>
</pre>
<pre>
 <span class="keyword">my</span> <span class="variable">$store_scalar</span> <span class="operator">=</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span>
     <span class="keyword">my</span><span class="operator">(</span><span class="variable">$self</span><span class="operator">,</span> <span class="variable">$new_val</span><span class="operator">)</span> <span class="operator">=</span> <span class="variable">@_</span><span class="operator">;</span>
     <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Store</span><span class="operator">(</span><span class="keyword">uc</span> <span class="variable">$new_val</span><span class="operator">);</span>
 <span class="operator">};</span>
</pre>
<p>Here are <strong>FETCH</strong> and <strong>STORE</strong> callbacks for either an array or hash.
They do essentially the same thing as the scalar callbacks, but
provide a little more information.</p>
<pre>
 <span class="keyword">my</span> <span class="variable">$fetch</span> <span class="operator">=</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span>
     <span class="keyword">my</span><span class="operator">(</span><span class="variable">$self</span><span class="operator">,</span> <span class="variable">$key</span><span class="operator">)</span> <span class="operator">=</span> <span class="variable">@_</span><span class="operator">;</span>
     <span class="keyword">my</span> <span class="variable">$val</span> <span class="operator">=</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Fetch</span><span class="operator">(</span><span class="variable">$key</span><span class="operator">);</span>
     <span class="keyword">print</span> <span class="string">"In fetch callback, key=$key, val="</span><span class="operator">,</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Say</span><span class="operator">(</span><span class="variable">$val</span><span class="operator">);</span>
     <span class="keyword">my</span> <span class="variable">$args</span> <span class="operator">=</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Args</span><span class="operator">(-</span><span class="variable">fetch</span><span class="operator">);</span>
     <span class="keyword">print</span> <span class="string">", args=('"</span><span class="operator">,</span> <span class="keyword">join</span><span class="operator">(</span><span class="string">"', '"</span><span class="operator">,</span>  <span class="variable">@$args</span><span class="operator">),</span> <span class="string">"')"</span> <span class="keyword">if</span> <span class="variable">$args</span><span class="operator">;</span>
     <span class="keyword">print</span> <span class="string">".\n"</span><span class="operator">;</span>
     <span class="variable">$val</span><span class="operator">;</span>
 <span class="operator">};</span>
</pre>
<pre>
 <span class="keyword">my</span> <span class="variable">$store</span> <span class="operator">=</span> <span class="keyword">sub</span><span class="variable"> </span><span class="operator">{</span>
     <span class="keyword">my</span><span class="operator">(</span><span class="variable">$self</span><span class="operator">,</span> <span class="variable">$key</span><span class="operator">,</span> <span class="variable">$new_val</span><span class="operator">)</span> <span class="operator">=</span> <span class="variable">@_</span><span class="operator">;</span>
     <span class="keyword">my</span> <span class="variable">$val</span> <span class="operator">=</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Fetch</span><span class="operator">(</span><span class="variable">$key</span><span class="operator">);</span>
     <span class="variable">$new_val</span> <span class="operator">=</span> <span class="keyword">uc</span> <span class="variable">$new_val</span><span class="operator">;</span>
     <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Store</span><span class="operator">(</span><span class="variable">$key</span><span class="operator">,</span> <span class="variable">$new_val</span><span class="operator">);</span>
     <span class="keyword">print</span> <span class="string">"In store callback, key=$key, val="</span><span class="operator">,</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Say</span><span class="operator">(</span><span class="variable">$val</span><span class="operator">),</span>
       <span class="string">", new_val="</span><span class="operator">,</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Say</span><span class="operator">(</span><span class="variable">$new_val</span><span class="operator">);</span>
     <span class="keyword">my</span> <span class="variable">$args</span> <span class="operator">=</span> <span class="variable">$self</span><span class="operator">-&gt;</span><span class="variable">Args</span><span class="operator">(-</span><span class="variable">store</span><span class="operator">);</span>
     <span class="keyword">print</span> <span class="string">", args=('"</span><span class="operator">,</span> <span class="keyword">join</span><span class="operator">(</span><span class="string">"', '"</span><span class="operator">,</span>  <span class="variable">@$args</span><span class="operator">),</span> <span class="string">"')"</span> <span class="keyword">if</span> <span class="variable">$args</span><span class="operator">;</span>
     <span class="keyword">print</span> <span class="string">".\n"</span><span class="operator">;</span>
     <span class="variable">$new_val</span><span class="operator">;</span>
 <span class="operator">};</span>
</pre>
<p>In all cases, the first parameter is a reference to the Watch object,
used to invoke the following class methods.</p>
<p>
</p>
<hr />
<h1><a name="methods">METHODS</a></h1>
<dl>

⌨️ 快捷键说明

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