<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>LinuxSense &#187; perl范围声明</title>
	<atom:link href="http://www.linuxsense.org/archives/tag/perl%e8%8c%83%e5%9b%b4%e5%a3%b0%e6%98%8e/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linuxsense.org</link>
	<description>分享Linux技术的点点滴滴</description>
	<lastBuildDate>Sat, 01 Aug 2009 05:23:11 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>perl范围声明our,my,local</title>
		<link>http://www.linuxsense.org/archives/9207.html</link>
		<comments>http://www.linuxsense.org/archives/9207.html#comments</comments>
		<pubDate>Wed, 25 Feb 2009 03:42:08 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[local]]></category>
		<category><![CDATA[my]]></category>
		<category><![CDATA[our]]></category>
		<category><![CDATA[perl范围声明]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9207</guid>
		<description><![CDATA[本文系转载，对初学perl的同学相信有一定借鉴作用
老实说，这个东西有点折腾人，主要是书上的表述很晦涩，其实搞懂不难。
our,&#8221;把名字限于某个范围“，其实就是明确声明一个&#8221;全局变量&#8221;，虽然是在某个模块或者函数里面定义的，外面的也可以访问，如果已经声明过了，再次用&#8221;our&#8221;,表示此处用的是全局的那个，不是同名的私有或者局部变量
our $PROGRAM_NAME = &#8220;waiter&#8221;;
{
my $PROGRAM_NAME = &#8220;something&#8221;;
our $PROGRAM_NAME = &#8220;server&#8221;; #这里的our和外面的相同，和前句不同。
# 这里调用的代码看到的是&#8221;server&#8221;
}
# 这里执行的代码看到的仍然是&#8221;server&#8221;.

my ,&#8221;把名字和值都限于限于某个范围&#8221;,简单说，就是只能本层模块或者函数可以看到这个变量，高一层的或者低一层的都看不到的。
sub greeting1{
my ($hello) = &#8220;How are you do?&#8221;;
greeting2();
}
sub greeting2{
print &#8220;$hello\n&#8221;;
}
$hello = &#8220;How are you doing?&#8221;;
greeting2();
greeting1();
greeting2();
运行结果：
How are you doing?
How are you doing?
How are you doing?
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;
一个 How are you do? 都没有,在greeting1中call greeting2时，greeting2看不到greeting1的私有 $hello变量，只能看到外面的全局变量$hello
local,&#8221;把值局限于某个范围&#8221;，也有叫&#8221;动态词法范围&#8221;,有点不好懂。我的理解，就是本层和本层下层的函数可以看到本层的变量，但是本层上一层的不可以。到底范围是多少，不仅取决于本层的函数，还要看下一层的程序长度和深度，所以叫&#8221;动态范围&#8221;。
sub greeting1{
local ($hello) = &#8220;How are you do?&#8221;;
greeting2();
}
sub greeting2{
print &#8220;$hello\n&#8221;;
}
$hello = &#8220;How [...]]]></description>
			<content:encoded><![CDATA[<p>本文系转载，对初学perl的同学相信有一定借鉴作用</p>
<p>老实说，这个东西有点折腾人，主要是书上的表述很晦涩，其实搞懂不难。</p>
<p>our,&#8221;把名字限于某个范围“，其实就是明确声明一个&#8221;全局变量&#8221;，虽然是在某个模块或者函数里面定义的，外面的也可以访问，如果已经声明过了，再次用&#8221;our&#8221;,表示此处用的是全局的那个，不是同名的私有或者局部变量</p>
<p>our $PROGRAM_NAME = &#8220;waiter&#8221;;<br />
{</p>
<p>my $PROGRAM_NAME = &#8220;something&#8221;;<br />
our $PROGRAM_NAME = &#8220;server&#8221;; #这里的our和外面的相同，和前句不同。<br />
# 这里调用的代码看到的是&#8221;server&#8221;<br />
}<br />
# 这里执行的代码看到的仍然是&#8221;server&#8221;.</p>
<p><span id="more-9207"></span></p>
<p>my ,&#8221;把名字和值都限于限于某个范围&#8221;,简单说，就是只能本层模块或者函数可以看到这个变量，高一层的或者低一层的都看不到的。<br />
sub greeting1{<br />
my ($hello) = &#8220;How are you do?&#8221;;<br />
greeting2();<br />
}</p>
<p>sub greeting2{<br />
print &#8220;$hello\n&#8221;;<br />
}<br />
$hello = &#8220;How are you doing?&#8221;;<br />
greeting2();<br />
greeting1();<br />
greeting2();</p>
<p>运行结果：<br />
How are you doing?<br />
How are you doing?<br />
How are you doing?<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
一个 How are you do? 都没有,在greeting1中call greeting2时，greeting2看不到greeting1的私有 $hello变量，只能看到外面的全局变量$hello</p>
<p>local,&#8221;把值局限于某个范围&#8221;，也有叫&#8221;动态词法范围&#8221;,有点不好懂。我的理解，就是本层和本层下层的函数可以看到本层的变量，但是本层上一层的不可以。到底范围是多少，不仅取决于本层的函数，还要看下一层的程序长度和深度，所以叫&#8221;动态范围&#8221;。</p>
<p>sub greeting1{<br />
local ($hello) = &#8220;How are you do?&#8221;;<br />
greeting2();<br />
}</p>
<p>sub greeting2{<br />
print &#8220;$hello\n&#8221;;<br />
}<br />
$hello = &#8220;How are you doing?&#8221;;<br />
greeting2();<br />
greeting1();<br />
greeting2();</p>
<p>运行结果：<br />
How are you doing?<br />
How are you do?<br />
How are you doing?<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
跟用 my 时不一样了吧? 此时在greeting1调用greeting2时，greeting2可以看到greeting1的局部变量$hello,外部的全局变量当然就隐藏了。</p>
<p>原文地址：<span style="text-decoration: underline;"><a href="http://blog.chinaunix.net/u1/51156/showart_441696.html">http://blog.chinaunix.net/u1/51156/showart_441696.html</a></span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9207.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
