专注各种脚本编程
Baidu
加入收藏夹
本站内容有下面分类知识,欢迎您的到来^_^
shell相关:指令篇 基础篇 脚本欣赏 编程实例 shell问问 shell视频教程 技巧篇 水平测试 E文资料 vi编辑器 高级Bash脚本编程指南
其他:mysql perl c语言 oracle
当前位置:| 主页>perl>

perl变量作用域-包变量

百度收藏 QQ搜藏

作者:仙子
先看这个$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增加了新的非全局变量。

上一篇:perl之"子进程写往父进程的管道" 下一篇:perl变量作用域-词法变量(上篇)

power by soyo123 2007-2008