<?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/category/perl/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>
		<item>
		<title>Use Strict And Warnings （Perl）</title>
		<link>http://www.linuxsense.org/archives/9204.html</link>
		<comments>http://www.linuxsense.org/archives/9204.html#comments</comments>
		<pubDate>Wed, 25 Feb 2009 03:25:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Perl]]></category>
		<category><![CDATA[Strict]]></category>

		<guid isPermaLink="false">http://www.linuxsense.org/?p=9204</guid>
		<description><![CDATA[本文系转载，原文链接地址失效，可以去搜索引擎去搜索标题
取自PerlChina
跳转到:导航,搜索
原 名：Use Strict And Warnings
中 文: 如何使用 strict 和 warnings
作 者：runiq
原 文地址已经无效
发 表：Sep 07, 2001
翻 译：havel.zhang
审 校：qiang
出 处：中国 Perl 协会 FPC &#8211; PerlChina.org
提醒您：请保护作者的著作权,维护作者劳动的结晶。
目录
1 什么场合要用 use strict
2 为什么要用 use strict？
3 用 use strict 麻烦吗？
4 不错，那我怎么用 use strict 呢？
5 得，程序出错了，我该怎么办？
6 这也太麻烦了吧。懒惰不是 Perl 文化中的美德吗？
7 那 warnings 又是什么？
什么场合要用 use strict
当你的程序有一定的行数时，尤其是在一页放不下时，或者是你找不到发生错误的原因时。

为什么要用 use strict？
众多的原因之一是帮你寻找因为错误拼写造成的错误。比如错误使用了&#8217;$recieve_date&#8217; 变量，但实际上你在程序中已声明的是 &#8216;$receive_date&#8217; 变量，这个错误就很难发现。同样，use strict 迫使你把变量的范围缩到最小，使你不必担心同名变量在程序的其它部份发生不良作用。（尽管这是 my 的功能，但是如果你使用 [...]]]></description>
			<content:encoded><![CDATA[<p>本文系转载，原文链接地址失效，可以去搜索引擎去搜索标题</p>
<p><span style="color: #999999;">取自PerlChina<br />
跳转到:导航,搜索<br />
原 名：Use Strict And Warnings<br />
中 文: 如何使用 strict 和 warnings<br />
作 者：runiq<br />
原 文地址已经无效<br />
发 表：Sep 07, 2001<br />
翻 译：havel.zhang<br />
审 校：qiang<br />
出 处：中国 Perl 协会 FPC &#8211; PerlChina.org<br />
提醒您：请保护作者的著作权,维护作者劳动的结晶。</span></p>
<p><strong>目录<br />
<span style="text-decoration: underline;">1 什么场合要用 use strict<br />
2 为什么要用 use strict？<br />
3 用 use strict 麻烦吗？<br />
4 不错，那我怎么用 use strict 呢？<br />
5 得，程序出错了，我该怎么办？<br />
6 这也太麻烦了吧。懒惰不是 Perl 文化中的美德吗？<br />
7 那 warnings 又是什么？</span></strong></p>
<p><strong>什么场合要用 use strict</strong><br />
当你的程序有一定的行数时，尤其是在一页放不下时，或者是你找不到发生错误的原因时。<br />
<span id="more-9204"></span></p>
<p><strong>为什么要用 use strict？</strong><br />
众多的原因之一是帮你寻找因为错误拼写造成的错误。比如错误使用了&#8217;$recieve_date&#8217; 变量，但实际上你在程序中已声明的是 &#8216;$receive_date&#8217; 变量，这个错误就很难发现。同样，use strict 迫使你把变量的范围缩到最小，使你不必担心同名变量在程序的其它部份发生不良作用。（尽管这是 my 的功能，但是如果你使用 use strict 的话，它会强迫你用 my 声明变量，来达到上述目的）。</p>
<p><strong>用 use strict 麻烦吗？</strong><br />
不麻烦，只要在你的脚本的开始加上11个字符而已！(use strict;), 另外在整个程序中用my 声明变量。</p>
<p><strong>不错，那我怎么用 use strict 呢？</strong><br />
在你的脚本的开头 &#8216;#!/usr/local/bin/perl&#8217; 后面加上这句就行。</p>
<p>use strict;</p>
<p><strong>得，程序出错了，我该怎么办？<br />
</strong>常见的错误信息一般如下：</p>
<p>Global symbol &#8220;$xxx&#8221; requires explicit package name at ./tst line 5.这就是需要我们马上去解决的错误。（如果出现类似于 &#8216;Server Error&#8217; 之类的错误，请检查一下你的 web 服务器上的 error logs， 或用CGI::Carp包。 ）</p>
<p>任何时候，当你要声明一个变量时，都要把 &#8216;my&#8217; 放在前面。例如：</p>
<p># 把这段代码:<br />
$string = &#8220;hello world&#8221;;<br />
@array = qw(ABC DEF);<br />
%hash = (A=&gt;1, B=&gt;2);</p>
<p># 改成:<br />
my $string = &#8220;hello world&#8221;;<br />
my @array = qw(ABC DEF);<br />
my %hash = (A=&gt;1, B=&gt;2);</p>
<p># 把这段代码:<br />
# &#8216;$name&#8217; is global here<br />
foreach $name (@names) {<br />
print &#8220;Name: $name\n&#8221;;<br />
}</p>
<p># 改成:<br />
foreach my $name (@names) {<br />
# Now &#8216;$name&#8217; only exists in this block<br />
print &#8220;Name: $name\n&#8221;;<br />
}</p>
<p># 把这段代码:<br />
# 同样, &#8216;$digit&#8217; 在这里是全局变量<br />
foreach $digit (@digits) {<br />
$number = 10== $number + $digit;<br />
}<br />
print &#8220;Number: $number\n&#8221;;</p>
<p># 改成： (外层的变量(&#8216;$number&#8217;)<br />
# 将在外层声明):<br />
my $number = 0;<br />
foreach my $digit (@digits)<br />
# 现在&#8217;$digit&#8217; 仅仅在这个代码块里存在<br />
$number = 10== $number + $digit;<br />
}<br />
print &#8220;Number: $number\n&#8221;;</p>
<p># 把这段代码:<br />
sub my_sub {<br />
($arg1, $arg2) = @_;<br />
print &#8220;Arg1: $arg1 Arg2: $arg2\n&#8221;;<br />
}</p>
<p># 改成:<br />
sub my_sub {<br />
my ($arg1, $arg2) = @_;<br />
print &#8220;Arg1: $arg1 Arg2: $arg2\n&#8221;;<br />
}</p>
<p># 下面的代码好像在用 DBI 嘛？一样要改！:<br />
$sth-&gt;bind_columns(\$field1, \$field2);<br />
while ($sth-&gt;fetch) {<br />
print &#8220;F1: $field1 F2: $field2\n&#8221;;<br />
}</p>
<p># 改成:<br />
$sth-&gt;bind_columns(\my ($field1, $field2));<br />
while ($sth-&gt;fetch) {<br />
print &#8220;F1: $field1 F2: $field2\n&#8221;;<br />
}</p>
<p><strong>这也太麻烦了吧。懒惰不是 Perl 文化中的美德吗？</strong><br />
当然，懒惰是我们的美德。因为你会发现使用 use strict 之后，我们就不必花太多的时间自己去查找 use strict 可以找到的很多简单错误。</p>
<p><strong>那 warnings 又是什么？</strong><br />
哦，对了。在 Perl 5.6 及以后的版本里，我们可以在写 &#8216;use strict;&#8217; 的位置旁写 &#8216;use warnings;&#8217;:</p>
<p>use warnings;在 Perl 5.6 版之前（或者为了不同 Perl 版本间的兼容 ），你可以用命令行参数 &#8216;#!/usr/bin/perl -w&#8217;。还有一种办法是设置<br />
$^W变量（不过，如果<br />
$^W不在BEGIN{}程序块里的话，就没办法截取编译时的错误提示，所以一般我们用 &#8216;-w&#8217;）:<br />
#!/usr/local/bin/perl -w</p>
<p># 或者<br />
$^W = 1;<br />
# 或者<br />
BEGIN { $^W = 1 }如果你确定不用 warnings，你可以限制它的使用范围，如：</p>
<p># 把这段代码:<br />
sub add_two_numbers_which_might_be_undef {<br />
$_[0] + $_[1];<br />
}</p>
<p># 根据Perl 的版本不同改成下面的样子:<br />
# 1<br />
sub add_two_numbers_which_might_be_undef {<br />
# 参见 &#8216;perldoc perllexwarn&#8217;<br />
# 因为最好是只在你希望的地方禁止掉warning<br />
no warnings &#8220;uninitialized&#8221;;<br />
$_[0] + $_[1];<br />
}</p>
<p># 2<br />
sub add_two_numbers_which_might_be_undef {<br />
local $^W;<br />
$_[0] + $_[1];<br />
}</p>
<p>或者，你应像前面例子中声明 &#8216;$number&#8217;一样初始化变量。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linuxsense.org/archives/9204.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
