|
在编译程序时,编译器必须记录使用的所有变量名,文件句柄,目录句柄,格式以及子例程。Perl 将这些符号的名称作为键存储在每个包的散列表中。散列的名称和包的名称相同。与散列键相关联的值是对应的 的值,又称为别名(alias) 。
对于用相同名称表示的每个值,Perl 会创建单独的内部指针进行指向,如下图所示:
上面,每个符号都被赋予一个 typeglob ,它表示所有名为 x 的类型,如标量 $x ,数组 @x 都共享同一个名字 x 。
每个包都有自己的符号表。无论何时使用包声明,都要切换到该包的符号表,见 “” 。
从另一个包中访问另外一个包的变量,可通过“ 包名 + 双冒号( :: ) + 变量名 " 的方式指定。
由于 my 函数赋值的变量不能从其所在的包外面访问,而且它也没有存储在包符号表中,而是存储在为每个子程序所创建的缓冲区里。因此,在使用 "my" 变量时,用户无法通过包的符号表来访问它们,因为它们根本不在那里!
比如像在平时最常用的 main 包里,不但保存有如 STDIN, STDOUT, STDERR,ARGV 等符号及特殊变量($_ 和 $! ) ,而且还保存了程序里你自己定义的符号。
考虑下面代码:
[code=perl]#!/usr/bin/perl
our ($key, $value);
$main::flower = "Jasmine";
my ($name, @company);
$name = "enterprise";
@company = qw(sun groad apple);
while (($key, $value) = each (%main::)) {
print "$key:\t$value\n";
}
[/mw_shl_code]
运行输出:$ ./list.pl
version::: *main::version::
/: *main::/
stderr: *main::stderr
_<perl.c: *main::_<perl.c
_<./list.pl: *main::_<./list.pl
,: *main::,
_<mro.c: *main::_<mro.c
key: *main::key
Tie::: *main::Tie::
utf8::: *main::utf8::
": *main::"
re::: *main::re::
CORE::: *main::CORE::
flower: *main::flower
DynaLoader::: *main::DynaLoader::
mro::: *main::mro::
stdout: *main::stdout
: *main::
stdin: *main::stdin
ARGV: *main::ARGV
value: *main::value
INC: *main::INC
ENV: *main::ENV
Regexp::: *main::Regexp::
UNIVERSAL::: *main::UNIVERSAL::
$: *main::$
_<perlio.c: *main::_<perlio.c
main::: *main::main::
_<perlmain.c: *main::_<perlmain.c
PerlIO::: *main::PerlIO::
0: *main::0
_<universal.c: *main::_<universal.c :*main::
@: *main::@
STDOUT: *main::STDOUT
IO::: *main::IO::
: *main::
_: *main::_
Exporter::: *main::Exporter::
STDERR: *main::STDERR
Internals::: *main::Internals::
STDIN: *main::STDIN
DB::: *main::DB:: [beyes@beyes strict]$ ./list.pl |grep "key"
key: *main::key
[beyes@beyes strict]$ ./list.pl |grep "value"
value: *main::value
[beyes@beyes strict]$ ./list.pl |grep "flower"
flower: *main::flower
[beyes@beyes strict]$ ./list.pl |grep "company" # my 声明变量没有放在符号表中
[beyes@beyes strict]$ ./list.pl |grep "name" #my 声明变量没有放在符号表中
由输出可见,由 my 声明的变量是不放在符号表中的,但 our 声明的变量则会放在符号表中。our 声明的变量是全局变量,也是一个词法变量, |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|