作者:仙子 先看这个$x = 1,这里,$x是个包变量。关于包变量,有2件重要的事情要了解:
1)假如没有其他申明,变量就是包变量; 2)包变量总是全局的。
全局意味着包变量在每个程序里总可访问到。在你定义了$x=1后,程序的任何其他部分,甚至在其他文件里定义的子程序,都能影响和修改$x的值。这点毫无例外;包变量总是全局的。
包变量被归类到族(叫做packages)。每个包变量的名字包括2部分。这2部分类似于变量自己的名字和族名。假如喜欢,你可以称呼美国副总统为'AL',但对其全名'Al Gore'来讲,这确实太短。类似的,$x有一个全名,其形式如$main::x。主要部分是包限定词,类似于'Al Gore'里的'Gore'部分。Al Gore和AL Capone是不同的人,尽管他们都叫做'AL'。同样的,$Gore::Al和$Capone::Al是不同的变量,$main::x and $DBI::x也是不同的变量。
允许指定变量名的包部分,假如这样做,perl会明确知道你指的是哪个变量。但为简洁起见,通常不会指定变量的包限定词。
1.当前包
假如你仅说$x,perl假设你指的是当前包里的变量$x。什么是当前包?通常情况下是指main,但你可以改变当前包,在程序里这样写:
package Mypackage;
从这点开始,当前包就是Mypackage。当前包做的唯一事情是,在你没有指定包名时,它影响对包变量的解释。假如当前包是Mypackage,这时$x实际指$Mypackage::x。假如当前包是main,这时$x实际指$main::x。
假如你在编写一个模块,假设模块名称是MyModule,你可能会将如下行放在模块文件的顶部:
package MyModule;
从这里开始,你在模块文件里使用的所有包变量将位于包MyModule里,你可以非常放心,这些变量不会与程序其他部分的变量冲突。不必担心你和DBI的作者是否会使用同一个变量$x,因为变量会被区分开,一个是$MyModule::x,另一个是$DBI::x。
记住包变量总是全局的。即使你不在DBI包里,甚至即使你从来没听说过DBI包,也没什么能阻止你读取或写入$DBI::errstr。你不必做任何特殊事情。$DBI::errstr象所有包变量一样,是个全局变量,它可全局访问到;你要做的唯一事是用全名来获取它。甚至可以这样写:
package DBI; $errstr = 'Ha ha Tim!';
这样就修改了$DBI::errstr。
2.包变量的其他补充
1)若包名为空,则等同于main。所以对任何x来讲,$::x等同于$main::x。
2)某些变量总是强迫位于main包里。例如,假如你提及%ENV,perl假设你指%main::ENV,即使当前包不是main。假如你想要%Fred::ENV,就必须明确申明,即使当前包是Fred。其他特殊的变量包括INC,所有的单标点符号变量名例如$_,$$, @ARGV,以及STDIN, STDOUT, 和STDERR。
3)包名,而非变量名,可以包含::。你可以命名变量为$DBD::Oracle::x。这意味着变量x位于包DBD::Oracle里;它与包DBD没有任何关系。Isaac Newton与 Olivia Newton-John无关,并且Newton::Isaac也与Newton::John::Olivia无关。尽管它们看起来都以Newton开头,但实际上这有点欺骗性。Newton::John::Olivia位于Newton::John包里,而不是Newton里。
包变量是全局的,这意味着它是危险的,因为不能保证某个人不会在背后来破坏它们。在Perl 4之前,所有的变量都是包变量,这点令人不安。所以perl 5增加了新的非全局变量。 |