
I.知识点概要:
2.全局变量标准(our)关键字、局部变量标准(my)关键字
3.(local)关键字将全局变量临时借用为局部、(state)关键字将局部变量变得持久
在Perl中,所有的变量、子程序和其他可以被命名的实体默认都拥有包作用域(亦称“全局作用域”),也就是说它们存在于当前包的符号表中。

如果没有关键字声明变量,Perl会默认变量为全局变量,但如果启用了use strict指令强制规定,则Perl会强制要求必须先声明变量后才可使用变量。
1.包域全局our
our操作符用于显式地创建包作用域变量。
#关键字our
our$Scalar=1;#全局,作用域为包
subSubroutine{
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;#全局,作用域为包
subSubroutine{
local$Scalar=2;#临时全局变量,作用域为子程序内部
$Scalar+=1;
print$Scalar;
}
&Subroutine;#输出3
&Subroutine;#输出3
print$Scalar;#输出1
结构体变量在使用常量进行整体初始化的时候只能在声明定义的时候进行,不能是声明结束之后。答:我不知道这段代码的具体功能,但明显有两个错误 1,srm_no没有赋初值 2,由于static的声明,使该函数成为不可重入(即不可预测结果)函数,因为srm_no变量放在程序的全局存储区中,每次调用的时候还可以保持原来的赋值。这好像是在ie中 “在全局域中声明变量是不属于全局对象的属性的” 通过 this.x = 1 声明属性, 使用 delete x 会报错通过变量声明 var x = 1。

注2:local变量是在运行时起作用,它会将参数的值保存在一个运行栈中,当执行线程离开所在作用域时,原先作用域暂存的变量会被恢复。
3.私有局部my
虽然local操作符的历史比my操作符久远,但Perl后来还是新增了my来分担local的工作,在大部分情况下应首选my,但也有一些特殊情况下必须使用local。
my操作符用于创建词法作用域变量,通过my创建的变量,存活于声明开始的地方,直到闭合作用域的结尾。
闭合作用域指的可以是一对花括号中的区域,可以是一个文件,也可以是一个eval字符串。

#关键字my
my$Scalar=1;#私有局部变量,作用域为当前文件
subSubroutine{
my$Scalar=2;#私有局部变量,作用域为花括号
$Scalar+=1;
print$Scalar;
}
&Subroutine;#输出3
&Subroutine;#输出3
print$Scalar;#输出1
有些时候,你会看到以一个下划线开头的实例变量名,比如_name,这样的实例变量外部是可以访问的,但是,按照约定俗称的规定,当你看到这样的变量时,意思就是,“虽然我可以被访问perl scalar函数,但是,请把我视为私有变量,不要随意访问”。如上代码:利用闭包可以给用特权的方法访问私有属性,保证了私有变量不被修改和污染,当然根据实际需求可以设置通过方法修改私有属性也是可行的。作用域分为局部作用域和全局作用域,在局部作用域里可以访问到全局作用域的变量,但在局部作用域外面就访问不到局部作用里面所设定的变量。
注2:当闭合作用域里的my变量与外层变量重名时,当前my变量有效,当退出作用域时,外层变量值不变。
4.持久局部state
操作并不具备原子性,该操作是先读取值,然后写回一个新值,相当于原来的值加上1,分两步完成,如果第二个线程在第一个线程读取旧值和写回新值期间读取i的域值,那么第二个线程就会与第一个线程一起看到同一个值,并执行相同值的加1操作,这也就造成了线程安全失败,因此对于increase方法必须使用synchronized修饰,以便保证线程安全。(3)修饰变量:表示变量只能一次赋值以后值不能被修改(常量)。这里设置两个变量.变量msg用来检测当前等待处理的消息.变量out初始值是false.它是用来标记当前还在运行状态.只要它的值仍然是false,程序就会继续运行.如果从false变成true,程序就会退出.。
#关键字state
my$Scalar=1;#私有局部变量,作用域为当前文件
subSubroutine{
state$Scalar=2;#持久局部变量,作用域为子程序内部
$Scalar+=1;
print$Scalar;
}
&Subroutine;#输出3
&Subroutine;#输出4
print$Scalar;#输出1
注1:state仅能创建闭合作用域为子程序内部的变量。
注2:state是从Perl 5.10开始引入的,所以使用前必须加上use 5.010或更高版本指令。
2. 掌握一维/二维数组变量的声明、初始化以及数组之间的赋值方法.p188-192 声明:数据类型 标识符[常量表达式 1][常量表达式 2]· · · 1) 确定数组的名称 2) 确定数组元素的类型 3) 确定数据的结构(包括数组维数,每一维的大小等) 初始化:数组的初始化就是在声明数组时给部分或全部元素赋初值。6『代码』//声明对象(有几个窗口声明几个)redimdm_all(js)fori=1tojs//分别创建对象,对象存放在数组中setdm_all(i)=createobject("dm.dmsoft")next『注意』按键中不支持数组形式对象直接使用命令perl scalar函数,例如:dm_all(0).movetox,y不支持这样使用。这个函数接受两个参数,char * 和int *,因为你必须分配一个字符串缓冲区以接受字符串指针,你可以使用string类代替这个参数类型,当然你还可以声明一个字节数组传递ansi字符串,同样你也可以声明一个只有一个元素的长整型数组,使用数组名作为第二个参数。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-115023-1.html
限制条件可放宽
何须炫富