加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[Perl语法篇] 05 -- 变量作用域:our、local、my、state

发布时间:2020-12-16 00:04:04 所属栏目:大数据 来源:网络整理
导读:?------------------------------------------------------------------------------------------------------------------------------- ?I.知识点概要: ??? 1.变量范围分为两类:全局、局部 ??? 2.全局变量标准(our)关键字、局部变量标准 (my) 关键字
?-------------------------------------------------------------------------------------------------------------------------------

?I.知识点概要:

??? 1.变量范围分为两类:全局、局部

??? 2.全局变量标准(our)关键字、局部变量标准(my)关键字

??? 3.(local)关键字将全局变量临时借用为局部、(state)关键字将局部变量变得持久

-------------------------------------------------------------------------------------------------------------------------------

? 在Perl中,所有的变量、子程序和其他可以被命名的实体默认都拥有包作用域(亦称“全局作用域”),也就是说它们存在于当前包的符号表中。

? 如果没有关键字声明变量,Perl会默认变量为全局变量,但如果启用了use strict指令强制规定,则Perl会强制要求必须先声明变量后才可使用变量。

?1.包域全局our

?our操作符用于显式地创建包作用域变量。

[ruby] view plain copy print ?
  1. #?关键字our ??
  2. ?our?$Scalar?=1;??????????????????#全局,?作用域为包 ??
  3. ?sub?Subroutine{??
  4. ?????our?$Scalar?=2;??????????????#全局,?作用域为包 ??
  5. ?????$Scalar?+=1;??
  6. ?????print?$Scalar;???????????????????
  7. ?}??
  8. ?&Subroutine;?????????????????????#输出3 ??
  9. ?&Subroutine;?????????????????????#输出3? ??
  10. ?print?$Scalar;???????????????????#输出3??

? 注1our操作符是在Perl 5时代被引入的,Perl 4时代变量均为全局,且不需声明。到了Perl 5时代为避免变量混乱,引入了use strict指令强制规定必须声明变量,而our操作符就是定义了一个看起来像词法作用域的全局变量,从而通过strict指令限制。

? 注 2 :如果全局变量已存在,则 our 的作用是声明这个全局变量(类似于 C 中的 extern )。

?2.临时全局local

?? local操作符需配合our操作符使用(或其他包中的全局变量),用于产生一个局部变量的效果。

[ruby] view plain copy print ?
  1. #?关键字local ??
  2. ?our?$Scalar?=1;??????????????????#全局,?作用域为包 ??
  3. ?sub?Subroutine{??
  4. ?????local?$Scalar?=2;????????????#临时全局变量,??作用域为子程序内部 ??
  5. ?????$Scalar?+=1;??
  6. ?????print?$Scalar;???????????????????
  7. ?}??
  8. ?&Subroutine;?????????????????????#输出3 ??
  9. ?&Subroutine;?????????????????????#输出3? ??
  10. ?print?$Scalar;???????????????????#输出1???

? 注1:很显然local只能声明已定义的全局变量,被my定义的变量是不可以被local声明的,即local本身不能创造变量。

? 注 2 local 变量是在运行时起作用,它会将参数的值保存在一个运行栈中,当执行线程离开所在作用域时,原先作用域暂存的变量会被恢复。

3.私有局部my

? 虽然local操作符的历史比my操作符久远,但Perl后来还是新增了my来分担local的工作,在大部分情况下应首选my,但也有一些特殊情况下必须使用local。

? my操作符用于创建词法作用域变量,通过my创建的变量,存活于声明开始的地方,直到闭合作用域的结尾。

? 闭合作用域指的可以是一对花括号中的区域,可以是一个文件,也可以是一个eval字符串。
[ruby] view plain copy print ?
  1. #?关键字my ??
  2. ?my?$Scalar?=1;???????????????????#私有局部变量,?作用域为当前文件 ??
  3. ?sub?Subroutine{??
  4. ?????my?$Scalar?=2;???????????????#私有局部变量,?作用域为花括号 ??
  5. ?????$Scalar?+=1;??
  6. ?????print?$Scalar;???????????????????
  7. ?}??
  8. ?&Subroutine;?????????????????????#输出3 ??
  9. ?&Subroutine;?????????????????????#输出3? ??
  10. ?print?$Scalar;???????????????????#输出1??

? 注1my是编译时在私有符号表中创建新变量,这个变量在运行时无法使用名字进行独立访问,即它不存在于包符号表中(非全局)。

? 注 2 :当闭合作用域里的 my 变量与外层变量重名时,当前 my 变量有效,当退出作用域时,外层变量值不变。


4.持久局部state

? state操作符功能类似于C里面的static修饰符,它与my不同的是,my变量在退出闭合作用域后其值不存在了,而state变量的值会被保留。

[ruby] view plain copy print ?
  1. #?关键字state ??
  2. ?my?$Scalar?=1;???????????????????#私有局部变量,?作用域为当前文件 ??
  3. ?sub?Subroutine{??
  4. ?????state?$Scalar?=2;????????????#持久局部变量,?作用域为子程序内部 ??
  5. ?????$Scalar?+=1;??
  6. ?????print?$Scalar;???????????????????
  7. ?}??
  8. ?&Subroutine;?????????????????????#输出3 ??
  9. ?&Subroutine;?????????????????????#输出4? ??
  10. ?print?$Scalar;???????????????????#输出1???

? 注1state仅能创建闭合作用域为子程序内部的变量

? 注2state是从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章,子程

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读