1.包和模块
在面向对象的编程中,每个对象都属于一个类。
类是可以用来重复使用的。
在perl中 模块 相当于 类
模块是Perl中重复使用的基本单位。
模块跟类应该是个抽象的逻辑上的概念。
模块(类)是用与这个类同名的包来实现的,即模块的定义。
比如 package Human;
# statement
# ……
为了让人们重复使用这些模块的定义,就将文件跟包取相同的名字,并使用.pm扩展名,pm是"perl module"的缩写。
2.名字空间,标识符
包划分了一个名字空间。
比如你写一段代码时候,给代码划分了一个你的名字空间。那么在你的空间里,外面别人的变量,函数影响不到你,你的也影响不到别人。
名字空间,名字 就是 标识符
比如: package Human
$Mike;
our @John;
my %Stella;
Mike,John,Stella 就是所谓的名字,即标识符
Mike,John就是属于Human这个名字空间的
至于Stella,这里需要说明的是:
my声明的变量独立于包:他们总是属于并且只是属于它们的闭合作用域,不管有什么包声明。
甚至$_也是属于包的,不过不是属于当前包,而是属于main包。
package声明的作用域从声明本身开始直到闭合作用域的结束,或者直到其他同级package声明。包声明的作用只是为该块其他部分选择将要使用的符号表
3.使用其它包中的标识符
标识符很难理解清楚,就像很多人不理解什么是typeglob一样
我的理解是 sym是标识符,*sym就是typeglob
根据上面的例子
Mike是Human包里的标识符
那么 可以用 包名和双冒号来限定
Human::Mike 这样就引用了Human包里的Mike名字
我们知道,在Human包里$Mike是一个标量
那么我们用$Human::Mike就可以取得Human包里$Mike的标量值
请注意 $Human::Mike中Human,Mike称做标识符,而Human::Mike应该叫变量名
4.符号表
包的内容总体在一起称做符号表。我理解就是标识符/对应typeglob对的总和
符号表都存储在一个散列里,这个散列跟包的名字相同,但是后面加了两个冒号。
main包的符号表的名字是%main::
在符号表的散列里,每个键/值对都把一个变量名和它的值匹配起来。键是符号标识符,值是对应的typeglob
下面两个是(几乎)一样的效果
*sym = *main::variable;
*sym = $main::{"variable"};
第一种我是根据3引用标识符去理解的
第二种我是通过符号表散列去理解的