perl声明变量 my local our state

一、范围变量声明

1、our  "把名字限于某个范围“,其实就是明确声明一个"全局变量",虽然是在某个模块或者函数里面定义的,外面的也可以访问,如果已经声明过了,再次用"our",表示此处用的是全局的那个,不是同名的私有或者局部变量

2、my  "把名字和值都限于限于某个范围",简单说,就是只能本层模块或者函数可以看到这个变量,高一层的或者低一层的都看不到的。

3、local  "把值局限于某个范围",也有叫"动态词法范围",有点不好懂。我的理解,就是本层和本层下层的函数可以看到本层的变量,但是本层上一层的不可以。到底范围是多少,不仅取决于本层的函数,还要看下一层的程序长度和深度,所以叫"动态范围"。

在my没有出现之前的权益方案,比如一个变量$!被定义成了全局变量,又想暂时使用一个也叫$!的临时变量,则可以用local,但在my出现以后,就不必使用local。

4、state

state $n = 0;    # private, persistent variable $n

state @array = qw(a b c);   # Error! 

state @array;

@array = qw(a b c);#Right!

5、全局变量

当你只有一个pl文件时,很简单,把你的全局变量在文件头部定义成our就行。在文件头把变量定义成my, 也是全局可用的,但是冒了风险,假如在某个函数里用my再定义一次,原来的值可就消失了。用our就不存在多次定义会导致丢值的状况。

当你在写一个有一个pl文件,N个pm文件的系统时该如何呢?事实上Perl里的变量和函数名都有一个系统级的名字。比如说你在某pm文件的头上定义了包名和全局变量
package bagua;
our $east = 'wood';
那么在任何地方,任何pm和pl文件里都可以使用$bagua::east来访问这个变量。$bagua::east就被称为系统级名字。

如果你是在pl里定义全局变量,而且该文件没有定义package名字怎么办?Perl会生成一个缺省的package,名字叫"main"。所以如果你的pl文件是这样
our $szVersion = '1.0.1";
那么在其它文件里就可以用$main::szVersion来访问,并不需要你定义package main.

最后,说一个邪门招式。你可以试一下定义任意一个含有::的变量
our $gColor::Blue = '0x0000FF';
这个变量就在任何地方可用,哪怕你从来没有定义过gColor这个package。这个是Perl的灵活性的体现,它看到这个就自动生成了gColor这个名字空间。当然,我不鼓励这种无厘头的用法。

6、my local 区别

#!/usr/bin/perl
# not strict clean, yet, but just wait
$global = "I'm the global version";
show_me('At start');
lexical();
localized();
show_me('At end');
sub show_me
{
my $tag = shift;
print "$tag: $global\n"
}
sub lexical
{
my $global = "I'm in the lexical version";
print "In lexical(), \$global is --> $global\n";
show_me('From lexical()');
}
sub localized
{
local $global = "I'm in the localized version";
print "In localized(), \$global is --> $global\n";
show_me('From localized');
}
##############################################

运行结果是
***************************************************
At start: I'm the global version
In lexical(), $global is --> I'm in the lexical version
From lexical: I'm the global version
In localized(), $global is --> I'm in the localized version
From localized: I'm in the localized version
At end: I'm the global version
***************************************************

分析:
1.my和local都只在一个block里有效,出去就失效
2.但是local的变量可以继续在这个block中调用的子程序中存在
3.如果有与外界同名的变量,两者在block退出后都不影响外界同名变量

our:

如果在一个block中有一个my修饰的变量和外界的一个变量同名,而且又需要在这个block中使用外接变量时,两个办法:
第一个办法,用main的package修饰这个变量名,$main::global
第二个办法,用our修饰,our $global,那么该block中接下来出现的所有$global都是外界的global


你可能感兴趣的:(perl声明变量 my local our state)