Perl 关于 use strict 的用法
什么场合要用 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 了吧,它使我们大家生活可以轻松一些:)
Perl 关于 use strict 的用法的更多相关文章
- perl中 use strict会出现“requires explicit package name”错误
转载 perl中use strict的用法 如果你使用 use strict 的话,它会强迫你用 my 声明变量,否则将会报上述错误.
- perl之grep函数的用法
转载至 perl中grep的详细用法 grep有2种表达方式: 1 grep BLOCK LIST 2 grep EXPR, LIST BLOCK表示一个code块,通常用{}表示:EXPR表示一个表 ...
- Perl 中 Pod 的基本用法。
1. Pod 语法 pod中用段分可以分为三种,普通段落,字面段落(Verbatim Paragraph)和命令段落.三者的区分非常简单,以=pod|head1|cut|over等指示字开始的段落为命 ...
- perl中sprintf函数的用法
对于某些字符串,需要输入为特定的格式,通过sprintf可以很方便的完成,不需要专门进行其他处理. 转载 perl中sprintf函数的使用方法.
- perl split 的一种特殊用法
参考 http://blog.chinaunix.net/uid-1919528-id-2792055.html split 函数的正规语法应该是: split /PATTERN/, EXPR 而使用 ...
- perl getopt 用法
我们在linux经常常使用到一个程序须要增加參数,如今了解一下perl中的有关控制參数的函数.getopt.在linux有的參数有二种形式.一种是--help,还有一种是-h.也就是-和--的分别.- ...
- 在命令行下使用perl
http://blog.sina.com.cn/s/blog_4af3f0d20100g9oz.html aaa@domain.com 2aaa@domain.com 111bbb@home.com ...
- perl 箭头操作符
箭头操作符有两种用法. 第一种用法是访问引用中的数据元素: #!/usr/bin/perl -w use strict; my @a = (5, 6, 7,9); my $aref = \@a; pr ...
- perl基本语法--转载
http://www.cnblogs.com/zhtxwd/archive/2012/03/06/2381585.html 本文介绍从变量类型.操作运算符.控制叙述.子程序.I/O和档案处理. Reg ...
随机推荐
- 如何利用OCS存取PHP session全局变量
如何利用OCS存取PHP session全局变量 阿里云技术团队:余汶龙 一.场景介绍 用户在利用PHP搭建网站时,会把一些信息存放在$_SESSION全局变量里,可以很方便的存取.在PHP的in ...
- 【Linux/Ubuntu学习 12】ubuntu下对/etc/profile误修改导致系统不能登录
etc/profile里设置环境变量导致无法登录解决 1,因为不小心在 etc/profile里设在环境变量导致无法登录 不要在 etc/profile里设置 export PATH这样会导 ...
- c++的输入流基础知识
cin是istream类的对象,它从标准输入设备获取数据,程序中的变量通过流提取符“>>”从流中提取数据.从流中提取数据时通常跳过输入流中的空白符 只有在输入完数据并按回车后,该行数据 ...
- jQuery formValidator表单验证插件
什么是jQuery formValidator? jQuery formValidator表单验证插件是客户端表单验证插件. 在做B/S开发的时候,我们经常涉及到很多表单验证,例如新用户注册,填写个人 ...
- C++字符类型总结区别wchar_t,char,WCHAR
转至:http://www.360doc.com/content/12/0807/01/9290626_228750141.shtml 1.区别wchar_t,char,WCHAR ANSI:即 ch ...
- 兼容性调试-- 在谷歌浏览器中,td 设置colspan的失效的问题
通过设置table width="100%"table-layout="fixed" 解决
- 跟我一起学习ASP.NET 4.5 MVC4.0(四)(转)
前几个文章中介绍了一些关于MVC4.0的东东,今天我们来看一下登陆验证,也可以说是权限验证,即AuthorizeAttribute.这个可以使用在控制器Controller上,也可以使用在Action ...
- Android应用数据备份
在Android上可以很方便地管理数据备份,那些不慎丢失设备的用户会对该功能感激不尽.备份数据会很安全地存储在云端,并且只在具有相同谷歌ID设备上恢复数据. 下面是典型的AndroidManifest ...
- Process Stats:了解你的APP如何使用内存(转)
原文地址:http://android-developers.blogspot.com/2014/01/process-stats-understanding-how-your.html?m=1 原作 ...
- sql 将某一列的值拼接成字符串
) set @str='' -- 必须先赋值 ))+',' from( select [objid],sfrq from tablename ) tb order by tb.sfrq print @ ...