用shell脚本实现大量的哈希或者是数值运算的话效率极低,还浪费资源想必很多人深有体会。但是在实际生产环境下有时有需要生成相应的报告等等,其中可能会用到大量的哈希或者是数值运算,那么还用shell脚本的话就不行,而在Unix系统下需要用到大量的哈希或者是数值运算时建议使用Perl,当然用Python也是可以,但是如果没有需要开发相应的工具的话用Perl还是最合适的,当然这也不是仅有的选择(awk、PHP、C等等都是可以的),这个只是个人的一点看法。Perl是Larry Wall大神在1987年发表公开的,它确实是Unix下的王牌,但是在平时的学习使用中很多人都不太明白Perl的变量作用的词法应用,在这里刚好找到一篇对Perl的变量作用的词法总结的不错的文章,在这里就收录下,以下来自:http://blog.csdn.net/henjay724/article/details/8457556

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.  初稿

转载于:https://blog.51cto.com/jim123/1894346

Perl的变量作用域:our、local、my、state相关推荐

  1. Python之变量作用域

    文章目录 一 变量作用域 1. Local(局部变量) 2. Enclosed(嵌套) 3. Global(全局) 4. Built-in(内置) 二 变量使用规则 三 变量的修改 1. global ...

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

    I.知识点概要: 1.变量范围分为两类:全局.局部 2.全局变量标准(our)关键字.局部变量标准(my)关键字 3.(local)关键字将全局变量临时借用为局部.(state)关键字将局部变量变得持 ...

  3. python local global_Python 变量作用域 LEGB (上)—— Local,Global,Builtin

    Python 变量作用域的规则是 LEGB LEGB含义解释: L -- Local(function):函数内的名字空间 E -- Enclosing function locals:外部嵌套函数的 ...

  4. php 变量作用域local,PHP 变量的四大作用域

    PHP 变量作用域 ● local ● global ● static ● parameter 局部作用域.全局作用域 $x = 50; // 全局变量 function myTest() { $y ...

  5. JavaScript变量作用域如何像多个级别的政府一样

    by Kevin Kononenko 凯文·科诺年科(Kevin Kononenko) JavaScript变量作用域如何像多个级别的政府一样 (How JavaScript variable sco ...

  6. C++ 笔记(06)— 变量作用域(局部变量、全局变量、静态局部变量)

    作用域是程序的一个区域,一般来说有三个地方可以定义变量: 在函数或一个代码块内部声明的变量,称为局部变量: 在函数参数的定义中声明的变量,称为形式参数: 在所有函数外部声明的变量,称为全局变量: 1. ...

  7. C++中的变量作用域介绍

    1.Cpp的变量作用域 作用域是程序的一个区域,一般来说有三个地方可以定义变量: 局部变量:在函数或一个代码块内部声明的变量 形式参数:在函数参数的定义中声明的变量(稍后介绍) 全局变量:在所有函数外 ...

  8. mysql变量作用域,变量作用域 | 类型、变量和值 | JavaScript 权威指南

    变量作用域 由 学院君 创建于1年前, 最后更新于 1年前 版本号 #2 724 views 0 likes 0 collects 变量的作用域指的是程序源码中定义这个变量的区域,全局变量具有全局作用 ...

  9. Python基本语法_变量作用域LEGB

    目录 目录 软件系统 变量的作用域 高级语言对数据类型的使用过程 作用域的产生 作用域的类型 Llocal局部作用域 Eenclosing嵌套作用域 Gglobal全局作用域 Bbuilt-in内置作 ...

最新文章

  1. weblogic常见漏洞
  2. c++的文件输入/输出
  3. apache camel_学习Apache Camel –实时索引推文
  4. dnf用虚拟机会被制裁吗_DNF: 神豪奶妈扬言, 战斗力没有超过他的, 都不配被加buff!...
  5. 接待员如何向客人upsell_客房留言卡也能收获好评,看看高情商酒店如何做的?...
  6. ArrayList源码浅析
  7. jQuery DOM/属性/CSS操作
  8. 计算两个NSDate是否处于同一天
  9. MYSQL当前时间与数据库里数据时间做比较
  10. hadoop中HDFS命令遇到的问题
  11. 使用uniapp时十分方便的登录静态模板
  12. ZZULIOJ1011: 圆柱体表面积
  13. ngx_shmtx_lock 分析
  14. HC32L110(一) HC32L110 芯片介绍和Win10下DAP-Link, ST-Link, J-Link方式的烧录
  15. #ncbi #blast
  16. 高考大数据:全国31省高考难度,哪个才是地狱模式?
  17. 可以ping通外网,ping不通内网,同时可以Ping网关,但是外部ping不到IP
  18. Windows10+ubuntu 双系统安装(针对联想小新air14)
  19. Bug的生命周期_Sinno_Song_新浪博客
  20. WINDOWS10使用LPR方式连接网络打印机

热门文章

  1. iPhone计算机怎么看之前的,怎么看手机型号-入手iPhone8/8P前要看!A1863/A1864与其他版本的差别...
  2. 数据分析师的自我修养——房价篇
  3. Android 相机预览帧存入本地
  4. 跨域传值即主页面与iframe之间互相传值
  5. SQL-基础 约束(添加-删除外键)
  6. Python 判断今天是今年的第几天?
  7. 关于机顶盒H5页面开发
  8. 实战功能1.标准图幅分幅
  9. Python实现ANN与KNN的图像分类
  10. 让你说话更有魅力的口才训练技巧