[Perl语法篇] 变量作用域:our、local、my、state
来源:互联网 发布:淘宝福袋是什么意思 编辑:程序博客网 时间:2024/06/06 09:38
I.知识点概要:
1.变量范围分为两类:全局、局部
2.全局变量标准(our)关键字、局部变量标准(my)关键字
3.(local)关键字将全局变量临时借用为局部、(state)关键字将局部变量变得持久
在Perl中,所有的变量、子程序和其他可以被命名的实体默认都拥有包作用域(亦称“全局作用域”),也就是说它们存在于当前包的符号表中。
如果没有关键字声明变量,Perl会默认变量为全局变量,但如果启用了use strict指令强制规定,则Perl会强制要求必须先声明变量后才可使用变量。1.包域全局our
our操作符用于显式地创建包作用域变量。
# 关键字our our $Scalar =1; #全局, 作用域为包 sub Subroutine{ our $Scalar =2; #全局, 作用域为包 $Scalar +=1; print $Scalar; } &Subroutine; #输出3 &Subroutine; #输出3 print $Scalar; #输出3
注1:our操作符是在Perl 5时代被引入的,Perl 4时代变量均为全局,且不需声明。到了Perl 5时代为避免变量混乱,引入了use strict指令强制规定必须声明变量,而our操作符就是定义了一个看起来像词法作用域的全局变量,从而通过strict指令限制。
注2:如果全局变量已存在,则our的作用是声明这个全局变量(类似于C中的extern)。2.临时全局local
local操作符需配合our操作符使用(或其他包中的全局变量),用于产生一个局部变量的效果。
# 关键字local our $Scalar =1; #全局, 作用域为包 sub Subroutine{ local $Scalar =2; #临时全局变量, 作用域为子程序内部 $Scalar +=1; print $Scalar; } &Subroutine; #输出3 &Subroutine; #输出3 print $Scalar; #输出1
注1:很显然local只能声明已定义的全局变量,被my定义的变量是不可以被local声明的,即local本身不能创造变量。
注2:local变量是在运行时起作用,它会将参数的值保存在一个运行栈中,当执行线程离开所在作用域时,原先作用域暂存的变量会被恢复。3.私有局部my
虽然local操作符的历史比my操作符久远,但Perl后来还是新增了my来分担local的工作,在大部分情况下应首选my,但也有一些特殊情况下必须使用local。
my操作符用于创建词法作用域变量,通过my创建的变量,存活于声明开始的地方,直到闭合作用域的结尾。
闭合作用域指的可以是一对花括号中的区域,可以是一个文件,也可以是一个eval字符串。# 关键字my my $Scalar =1; #私有局部变量, 作用域为当前文件 sub Subroutine{ my $Scalar =2; #私有局部变量, 作用域为花括号 $Scalar +=1; print $Scalar; } &Subroutine; #输出3 &Subroutine; #输出3 print $Scalar; #输出1
注1:my是编译时在私有符号表中创建新变量,这个变量在运行时无法使用名字进行独立访问,即它不存在于包符号表中(非全局)。
注2:当闭合作用域里的my变量与外层变量重名时,当前my变量有效,当退出作用域时,外层变量值不变。4.持久局部state
state操作符功能类似于C里面的static修饰符,它与my不同的是,my变量在退出闭合作用域后其值不存在了,而state变量的值会被保留。
# 关键字state my $Scalar =1; #私有局部变量, 作用域为当前文件 sub Subroutine{ state $Scalar =2; #持久局部变量, 作用域为子程序内部 $Scalar +=1; print $Scalar; } &Subroutine; #输出3 &Subroutine; #输出4 print $Scalar; #输出1
注1:state仅能创建闭合作用域为子程序内部的变量。
注2:state是从Perl 5.10开始引入的,所以使用前必须加上use 5.010或更高版本指令。
注3:state可以声明标量、数组、哈希。但在声明数组和哈希时,不能对其初始化(至少Perl 5.14不支持)。-------------------------------------------------------------------------------------------------------------------------------
I.参考资料:
[1]. 盛春译.《Perl语言入门》[第六版][M].东南大学出版社,2012.
第四章,子程序
[2]. 周良忠译.《C程序员精通Perl》[M].人民邮电出版社,2003.
第7章,子程序和模块
[3]. 盛春译.《Perl高效编程》[第2版][M].人民邮电出版社,2011.
第4章,子程序
II.修订记录:
2013.01.08. 初稿
-------------------------------------------------------------------------------------------------------------------------------
- [Perl语法篇] 变量作用域:our、local、my、state
- [Perl语法篇] 05 -- 变量作用域:our、local、my、state
- perl变量作用域--local,my,our
- Perl中的变量作用范围 local, my, our与全局变量
- Perl中的变量作用范围 local, my, our与全局变量
- Perl 变量的作用my, our, local和全局变量
- my,our,local,Perl范围变量声明
- my,our,local,Perl范围变量声明
- my,our,local,Perl范围变量声明
- my,our,local,Perl范围变量声明
- perl local my our
- perl范围声明our,my,local
- perl local my our 的前世今生
- perl local my our 的前世今生
- Perl - my, local, our (最近在学perl)
- (转载) perl local my our 的前世今生
- perl中my、local和our区别与联系
- Perl中our,my,local的区别与联系
- c++课程设计
- [Linux内核设计与实现]Linux系统调用
- OpenMP概述
- 我要分享,关于Zxing的竖屏显示的我用的是
- 2013年的计划
- [Perl语法篇] 变量作用域:our、local、my、state
- redhat 5的中文包安装
- 关于"建立空文档失败"的问题的分析!
- .NET是什么?
- Linux下进行GDB调试
- javascript 函数中的apply()和call()方法。
- uCOS:时钟节拍代码追踪
- 添加com控件后 或者 active 控件后 创建空文档失败
- 家常菜做法:熬萝卜粉丝