当前位置: 传客网 > Perl 关于 use strict和use warings 的用法

Perl 关于 use strict和use warings 的用法

2016-12-22 作者:果龙女

文章来源:
http://blog.csdn.net/helpxs/article/details/7001059

什么场合要用 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 diagnostics和Use strict warnings and diagnostics or die.

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

取自"http://wiki.perlchina.org/index.php/Use_Strict_And_Warnings"


相关推荐

  • GROUP BY 用法(转载)——group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函

    groupby在我之前的工作中不一定用到,可惜groupby在一般的笔试测试的时候经常用到。所以今天刚开一个博客记录下groupby用法,为避免以后再犯这个错误。聚合函数求和函数——SUM()计数函数——COUNT()最大/最小值函数—MA

  • Easyui tree 用法小解

    我这里先说一下简单用法,具体可以参考API。.net数据结构如下:一.前台页面搭建------------------------1.HTML-------------------------------------------------

  • Mysql ON DUPLICATE KEY UPDATE 的 用法 简记

    MysqlONDUPLICATEKEYUPDATE的用法简记如果您指定了ONDUPLICATEKEYUPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARYKEY中出现重复值,则执行旧行UPDATE。例如,如果列a被定义为UN

  • mysql  coalesce 用法

    1:mysqlcoalesce()的用法是返回第一个非null的数据。mysql中的coalesce(exp1,exp2,exp3,。。。)遇到非null的数据返回。如果都是null,则返回null。

  • ABAP AT NEW 用法注意

    --BYJSC_Sam使用ATNEWF时需注意:1.F是内表第一个字段时,F后面字段的值不会发生变化2.F并非内表第一个字段时,系统会自动把F后面字段的值更改为*ATENDF的语法也是一样如需沟通讨论,可联系QQ:2622487640,本文

  • python 中 exec、 eval、 execfile 和 compile 用法

    exec语句用来执行储存在字符串或文件中的Python语句。例如,我们可以在运行时生成一个包含Python代码的字符串,然后使用exec语句执行这些语句。下面是一个简单的例子。>>>exec'print"HelloWorl

  • scanf 用法简介

    scanf("%d%d",&a,&b)输入的两个数据用空格,TAB或者回车区分开scanf("%d,%d",&a,&b)输入的两个数据用逗号区分开scanf用法简介scanf函数称为格式输入函数,即按用户指定

  • #pragma 用法

    今天刚开始调试windows核心编程中的例程就感觉十分难懂,原因是自己的c++基本功力实在太弱了首先在windows编程的过程中大量的使用宏的问题。#pragma的用法在所有的预处理指令中,#Pragma指令可能是最复杂的了,它的作用是设定

  • FNDLOAD 用法

    FNDLOAD用法语法:FNDLOADlogon0Ymodeconfigfiledatafile[entity[param...]]logon:EBS用户名/密码[@TNS连接别名]mode:UPLOAD或DOWNLOADconfigfil

  • 法律文书中SUBJECT TO 用法汇总

    本文出处:http://blog.163.com/xuhulong@126/blog/static/14526181120110271036330/包含subjectto的法律文书条款汇总如下(由徐虎龙律师提供):3.3Subjecttot

  • @RequestMapping 用法详解之地址映射(转)

    @RequestMapping用法详解之地址映射(转)引言:前段时间项目中用到了RESTful模式来开发程序,但是当用POST、PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没有加任何注解),查看了提交方式为appl

  • Java 中BufferedReader & InputStreamReader 用法

    转自:http://www.51testing.com/?uid-258885-action-viewspace-itemid-811659BufferedReader类BufferedReader由Reader类扩展而来,提供通用的缓冲方

  • expect spawn、linux expect 用法小记

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原理。  脚本代码如下:  ##########################

  • [转载]expect spawn、linux expect 用法小记

    原文链接:http://jxxms.iteye.com/blog/814964使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄、收藏。可是为什么要这么写却不知其然。本文用一个最短的例子说明脚本的原

  • CSS 各种滤镜代码解释 用法案例

    CSS濾鏡參考語法:STYLE="filter:filtername(fparameter1,fparameter2...)"  (Filtername為濾鏡的稱號,fparameter1、fparameter2等是濾鏡的參數)script

  • First, secondly, thirdly  用法(转载)

    写文章reviewer说我的用firstlysecondlythirdly不对!我上网查了一下,果然是自己用错了!Regardingtheuseoffirst,secondversesfirstly,secondlyetc(andRiver

  • 【转】 (跨域)JSONP原理 $.getJSON 用法 jquery跨域

    简介符合Web2.0特征的众多网站一个明显的特点就是采用Ajax。Ajax提供了在后台提交请求访问数据的功能。其实现主要使用的是XMLHttpRequest函数,这个函数允许客户端的Javascript发送到服务器端的HTTP请求并获得返回

  • AWK 用法简介

    AWK用法简介梗概AWK是Unix平台上一种能够对文本举行逐行安排的编程语言,它起源于3个创作者的名字:Aho、(Peter)Weinberg和(Brain)Kernighan.与sed和grep很相仿,awk是一种格式扫描与办理工具,但其

  • c语言中static 用法总结

    c语言中static用法总结惨痛教训:假设在test.h中定义了一个staticboolg_test=false;若test1.c和test2.c都包含test.h,则test1.c和test2.c分别生成两份g_test,在test1.c

  • NSString 用法汇总

    NSString用法汇总//一、NSString//1、创建常量字符串。NSString*astring=@"ThisisaString!";//2、创建空字符串,给予赋值。NSString*astring=[[NSStringalloc]

返回
顶部