perl的一些难以概念的概念

1.为什么perl的库有的是.pl的有的是.pm的?

答:.pl是一种比较老的形式的库的形式,.pm是一种新的形式。在导入这些库的时候,.pl只能用require导入,而.pm可以用require和use两种方式导入。

2.require 和use又什么区别?

答:require和use的共同目的都是用来装载库的,他们有点像c语言的动态装载和静态链接之间的关系,require动态装载库,也就是在perl程序运行时才装载perl库文件,use可以理解为静态连接,也就是perl脚本在编译的时候就装载了perl库。require可以装载.pm和.pl两种库,但use只能装载.pm库。use装载.pm 的时候,会执行.pm库里面package的export方法来导入库的符号表,这样就可以不用指定package的名字,而直接调用package的方法。

3.package 和module是什么关系?

答:package实际上是名字空间,而module实际上是一个抽象的概念,表示提供一种功能的代码集合,一个module通常是保存在一个.pm文件里面的。一个module可以包含一个或多个package,但为了编程的方便,通常一个module文件中只包含一个package,为什么这样说了,因为在导入模块的时候,use的参数实际上是文件名,如果这个文件名指定的模块中有几个package,而这些package都继承了export class到处符号表,那么只有和文件名相同的package的export方法能够被use调用,也就是说只有和文件名相同的package的符号表才能被导出来。所以最好一个模块文件只有一个package,而且这个package要和文件名一样。

4。my 和 our的区别

答:our很简单,它的意义就有点像c语言的external的变量,这个变量的是放在程序的堆空间里,也就是说生存周期和程序是一样的。our的变量是放在package的符号表里面的,也就是说可以被::操作符或者export方法导出。my变量就复杂很多,如果my变量是定义在package的最上层,也就是不再任何{}块里面,那么它就有点象c语言的static变量,它的地址是分配在堆里面,生存周期也是和程序一样,但它的符号没有放到package的符号表里面,所以不能用::或export导出。如果my变量是定义在{}里面,那么它的地址就在堆栈里面,{}结束以后,就会被释放。

5。perl实现面对对象的方式是怎么样的

答:基本上是package+ISA数组的方式。package实现了类的封装,ISA实现了类的继承

6.  @_到底应该怎么样理解?

答:先看一段程序

#!/usr/bin/perl

my $p=1;

sub value_replace{

  my $value = $_[0];

  $value=9;

  print "p is $p\n";

     $_[0] = 9;

     print "p is $p\n";

     foreach my $value (@_){

    $value = 20;

  }

  print "p is $p\n";

}

value_replace($p);

=========

结果是:

p is 1
p is 9
p is 20

以上测试结果说明了:

1.$_[0]这个符号并不是普通意义的数组访问,而是一个特殊的符号,它是一个typeglob

2. foreach的意义并不是把数组的值取出来,然后赋值给某一个局部变量,而是进行的符号替换

foreach my $value (@_){

    $value = 20;

  }

  print "p is $p\n";

比如上面这段代码,如果foreach是把$_[0]的值取出来,在赋值给$value局部变量,那么后面打印的p的值就应该是10,而不是20,

说明foreach在这里做的事情是符号替换(而不是数值拷贝),把value这个符号依次替换替换成_[0]这个符号的指向的地址

7. typeglob 是什么意思?到底应该怎么用?

答:先看个例子

#!/usr/bin/perl

my $a=1;

my $a_alias=2;

our $b=3;

our $b_alias=4;

*a_alias=*a;

*b_alias=*b;

print "a_alias = $a_alias,b_alias=$b_alias\n";

输出的结果是:

a_alias=2, b_alias=3

为什么a_alias没起作用,而b_alias起作用了?

因为typeglob实际上是对符号表的修改,在符号表增加了一个符号,和以前的符号指向同一个typeglob,my的变量是没有放在符号表的,而our的是放到符号表的,所以b_alias成功了

posted @ 2011-04-05 15:07  konggang  阅读(530)  评论(0编辑  收藏  举报