CSDN博客

img gumpgong

Perl的包

发表于2004/10/20 18:10:00  898人阅读

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引用标识符去理解的
第二种我是通过符号表散列去理解的

阅读全文
0 0

相关文章推荐

img
取 消
img