前言:使用use strict
perl语言编程环境有两套,宽松和严格,默认是宽松风格,而严格模式需要在文件开头使用use strict 命令。
通常建议大家都使用use strict,遵循严谨优良编程风格,在宽松风格下,脚本调试将是很复杂的一件事,不适合新手。
声明私有变量 my
要点1
在use strict模式下,一个文件内的所有变量都需要通过 my 进行声明,如:
my $fred;
my @fred;
my ($name_1,$name_2);
...
实例1
#!/usr/bin/perl
use strict;
$name;
$name = "zhangsan";
print "$name\n";
上述脚本中使用了严格模式,然后变量$name并未使用my声明,执行此文件便会报错:
Global symbol "$name" requires explicit package name at ./my07 line 5.
Global symbol "$name" requires explicit package name at ./my07 line 6.
Global symbol "$name" requires explicit package name at ./my07 line 7.
要点2
my声明的变量都是私有变量(也称为词法变量),需要注意的是变量的作用域 scope!!
作用域 scope
简单理解就是在哪使用 my 声明的变量,其作用域就是声明语句所在的范围,如:
#1.作用域为整个文件(实例2)
在文件中单独声明 --> 当一个变量可以该文件中不受限使用时,你也可以理解为全局变量
#2.作用域为某个子程序(实例3)
在子程序中声明
#3.作用域是某个条件判断(实例4)
在if语句中声明
#4.作用域是某个循环
在while语句中声明
......
⚠在strict模式下,所有变量都是私有变量(因为都要my声明),而作用域最大也就仅限于单个文件,那么当涉及可重用库和模块时,该模式便不适用了(局限性)。
实例2
#!/usr/bin/perl
use strict;
my $name;
$name = "zhangsan";
if($name eq "zhangsan"){
print "你找对人了,他叫$name\n";
}
print "他真的叫$name\n";
执行结果:
你找对人了,他叫zhangsan
他真的叫zhangsan
实例3
#!/usr/bin/perl
use strict;
my $name = "lisi";
sub test{
my $name = "zhangsan";
print "他叫$name\n";
};
&test;
print "他真的叫$name\n";
执行结果:上述示例中定义了两个作用域:文件和子程序,从结果可知,子程序中的变量优先调用自己范围内的变量(其他作用域可类推),并且不同作用域的变量名可相同,表明不同作用域的变量都有自己独立的命名空间。
[root@VM-0-8-centos scripts]# ./my07
他叫zhangsan
他真的叫lisi
实例4
#!/usr/bin/perl
use strict;
my $name = "lisi";
if($name eq "lisi"){
my $name = "zhangsan";
print "他叫$name\n";
};
print "他真的叫$name\n";
执行结果:分析可参见案例3
[root@VM-0-8-centos scripts]# ./my07
他叫zhangsan
他真的叫lisi
持久化声明私有变量state
先看一个在use strict模式下的案例
#!/usr/bin/perl
use strict;
sub sum{
my $n = 0;
$n += 1;
print "现在一共调用此子程序$n次\n";
};
∑
∑
∑
执行结果:从结果看,每次调用子程序,其子程序的私有变量的值在每次调用时都会被重置,然而有时候我们会重复调用某个子程序,并希望其私有变量的值不要重置,能一直保留(解决办法:使用state声明)。
[root@VM-0-8-centos scripts]# ./my07
现在一共调用此子程序1次
现在一共调用此子程序1次
现在一共调用此子程序1次
state使用案例
#!/usr/bin/perl
use strict;
use v5.10;
sub sum{
state $n = 0;
$n += 1;
print "现在一共调用此子程序$n次\n";
};
∑
∑
∑
执行结果:
[root@VM-0-8-centos scripts]# ./my07
现在一共调用此子程序1次
现在一共调用此子程序2次
现在一共调用此子程序3次
使用细节⚠⚠: 原先my替换成了state,并且添加了use v5.10语句,因为该特性是从Perl 5.10开始引入的,需要声明,否则会报错。
宽松模式下的全局变量和私有变量
待整理