什么场合要用 use strict

当你的程序有一定的行数时,尤其是在一页放不下时,或者是你找不到发生错误的原因时。

为什么要用 use strict?

众多的原因之一是帮你寻找因为错误拼写造成的错误。比如错误使用了'$recieve_date' 变量,但实际上你在程序中已声明的是 '$receive_date' 变量,这个错误就很难发现。同样,use strict 迫使你把变量的范围缩到最小,使你不必担心同名变量在程序的其它部份发生不良作用。(尽管这是 my 的功能,但是如果你使用 use strict 的话,它会强迫你用 my 声明变量,来达到上述目的)。

用 use strict 麻烦吗?

不麻烦,只要在你的脚本的开始加上11个字符而已!(use strict;), 另外在整个程序中用my 声明变量。

不错,那我怎么用 use strict 呢?

在你的脚本的开头 '#!/usr/local/bin/perl' 后面加上这句就行。

use strict;

得,程序出错了,我该怎么办?

常见的错误信息一般如下:

Global symbol "$xxx" requires explicit package name at ./tst line 5.

这就是需要我们马上去解决的错误。(如果出现类似于 'Server Error' 之类的错误,请检查一下你的 web 服务器上的 error logs, 或用CGI::Carp包。 )

任何时候,当你要声明一个变量时,都要把 'my' 放在前面。例如:

# 把这段代码:
$string = "hello world";
@array = qw(ABC DEF);
%hash = (A=>1, B=>2); # 改成:
my $string = "hello world";
my @array = qw(ABC DEF);
my %hash = (A=>1, B=>2); # 把这段代码:
# '$name' is global here
foreach $name (@names) {
print "Name: $name\n";
} # 改成:
foreach my $name (@names) {
# Now '$name' only exists in this block
print "Name: $name\n";
} # 把这段代码:
# 同样, '$digit' 在这里是全局变量
foreach $digit (@digits) {
$number = 10== $number + $digit;
}
print "Number: $number\n"; # 改成: (外层的变量('$number')
# 将在外层声明):
my $number = 0;
foreach my $digit (@digits)
# 现在'$digit' 仅仅在这个代码块里存在
$number = 10== $number + $digit;
}
print "Number: $number\n"; # 把这段代码:
sub my_sub {
($arg1, $arg2) = @_;
print "Arg1: $arg1 Arg2: $arg2\n";
} # 改成:
sub my_sub {
my ($arg1, $arg2) = @_;
print "Arg1: $arg1 Arg2: $arg2\n";
} # 下面的代码好像在用 DBI 嘛?一样要改!:
$sth->bind_columns(\$field1, \$field2);
while ($sth->fetch) {
print "F1: $field1 F2: $field2\n";
} # 改成:
$sth->bind_columns(\my ($field1, $field2));
while ($sth->fetch) {
print "F1: $field1 F2: $field2\n";
}

这也太麻烦了吧。懒惰不是 Perl 文化中的美德吗?

当然,懒惰是我们的美德。因为你会发现使用 use strict 之后,我们就不必花太多的时间自己去查找 use strict 可以找到的很多简单错误。

那 warnings 又是什么?

哦,对了。在 Perl 5.6 及以后的版本里,我们可以在写 'use strict;' 的位置旁写 'use warnings;':

use warnings;

在 Perl 5.6 版之前(或者为了不同 Perl 版本间的兼容 ),你可以用命令行参数 '#!/usr/bin/perl -w'。还有一种办法是设置

$^W

变量(不过,如果

$^W

不在BEGIN{}程序块里的话,就没办法截取编译时的错误提示,所以一般我们用 '-w'):

#!/usr/local/bin/perl -w

# 或者
$^W = 1;
# 或者
BEGIN { $^W = 1 }

如果你确定不用 warnings,你可以限制它的使用范围,如:

# 把这段代码:
sub add_two_numbers_which_might_be_undef {
$_[0] + $_[1];
} # 根据Perl 的版本不同改成下面的样子:
# 1
sub add_two_numbers_which_might_be_undef {
# 参见 'perldoc perllexwarn'
# 因为最好是只在你希望的地方禁止掉warning
no warnings "uninitialized";
$_[0] + $_[1];
} # 2
sub add_two_numbers_which_might_be_undef {
local $^W;
$_[0] + $_[1];
}

或者,你应像前面例子中声明 '$number'一样初始化变量。

你还可以参阅Ovid的妙文use strict' is not Perl

以及(Wog指出的):Use strict warnings and diagnosticsUse strict warnings and diagnostics or die.

okay,现在你应该没什么借口不用 use strict 或 use warnings 了吧,它使我们大家生活可以轻松一些:)

Perl 关于 use strict 的用法的更多相关文章

  1. perl中 use strict会出现“requires explicit package name”错误

    转载 perl中use strict的用法 如果你使用 use strict 的话,它会强迫你用 my 声明变量,否则将会报上述错误.

  2. perl之grep函数的用法

    转载至 perl中grep的详细用法 grep有2种表达方式: 1 grep BLOCK LIST 2 grep EXPR, LIST BLOCK表示一个code块,通常用{}表示:EXPR表示一个表 ...

  3. Perl 中 Pod 的基本用法。

    1. Pod 语法 pod中用段分可以分为三种,普通段落,字面段落(Verbatim Paragraph)和命令段落.三者的区分非常简单,以=pod|head1|cut|over等指示字开始的段落为命 ...

  4. perl中sprintf函数的用法

    对于某些字符串,需要输入为特定的格式,通过sprintf可以很方便的完成,不需要专门进行其他处理. 转载 perl中sprintf函数的使用方法.

  5. perl split 的一种特殊用法

    参考 http://blog.chinaunix.net/uid-1919528-id-2792055.html split 函数的正规语法应该是: split /PATTERN/, EXPR 而使用 ...

  6. perl getopt 用法

    我们在linux经常常使用到一个程序须要增加參数,如今了解一下perl中的有关控制參数的函数.getopt.在linux有的參数有二种形式.一种是--help,还有一种是-h.也就是-和--的分别.- ...

  7. 在命令行下使用perl

    http://blog.sina.com.cn/s/blog_4af3f0d20100g9oz.html aaa@domain.com  2aaa@domain.com 111bbb@home.com ...

  8. perl 箭头操作符

    箭头操作符有两种用法. 第一种用法是访问引用中的数据元素: #!/usr/bin/perl -w use strict; my @a = (5, 6, 7,9); my $aref = \@a; pr ...

  9. perl基本语法--转载

    http://www.cnblogs.com/zhtxwd/archive/2012/03/06/2381585.html 本文介绍从变量类型.操作运算符.控制叙述.子程序.I/O和档案处理. Reg ...

随机推荐

  1. 沈逸老师PHP魔鬼特训笔记(1)

    此课程个人开发环境可以考虑使用Ubuntu ,推荐sublime和PhpStorm作为开发环境.一.PHP的一大特性是:脚本语言.不要编译,写完就可以运行? 然而并不是....... PHP代码要想运 ...

  2. BeginInvoke、ThreadPool、Task三类异步方法的区别和速度比较

      速度(最快为1) 返回值 多参数 等待在时限内完成 超时后结束 ThreadPool.UnsafeQueueUserWorkItem() 1 非原生支持1 非原生支持 非原生支持3 不支持 Thr ...

  3. java程序执行内存处理过程

    我们学习知识,不仅要知其然,还要知其所以然,你的工资必定和你学习的深度成正比. 在以往.net的学习过程中,我们了解了怎么去开发一个程序,并有了一定的开发经验,但是一个程序具体是怎么在内存中运行的呢? ...

  4. 仿jQuery中undelegate()方法功能的函数

    //跨浏览器事件绑定 function addEvent(obj,type,fn){ if(typeof obj.removeEventListener !='undefined'){ /////// ...

  5. A的href和onclick

    我们在制作网页的时候用得最多的就是 A 标签 超连接 但有时候需要在 A 里同时用到 href 和 onclick属性 下面我们先来分析一下 ,在不同的浏览器下有不同的效果 1 顺序 ie 6 : h ...

  6. node.js学习的资源整理

    node中文社区 Node.js专业中文社区:https://cnodejs.org/ node文档 node.js 中文api :http://nodeapi.ucdok.com/ node.js入 ...

  7. [转]div 让文字或图片居中

    本文转自:http://qsfwy.iteye.com/blog/250206 在div 中让 文字或图片居中,请参考以下代码1: - - - - - - - - - - - - - - - - - ...

  8. hdu 3909 数独扩展

    思路:做法与9*9的一样.只不过是变量. #include<set> #include<map> #include<cmath> #include<queue ...

  9. Android achartengine统计图

    最近在安卓2.2上写个实时的监控程序,要用到统计图.从网上搜了下 Java4Less (http://java4less.com/charts/chart.php?info=android)     ...

  10. JS内存泄漏 和Chrome 内存分析工具简介(摘)

    原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱   原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - AR ...