曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 3827|回复: 0
打印 上一主题 下一主题

符号表

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34387
跳转到指定楼层
楼主
发表于 2011-10-24 10:57:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在编译程序时,编译器必须记录使用的所有变量名,文件句柄,目录句柄,格式以及子例程。Perl 将这些符号的名称作为键存储在每个包的散列表中。散列的名称和包的名称相同。与散列键相关联的值是对应的
typeglob
的值,又称为别名(alias) 。

对于用相同名称表示的每个值,Perl 会创建单独的内部指针进行指向,如下图所示:


上面,每个符号都被赋予一个 typeglob ,它表示所有名为 x 的类型,如标量 $x ,数组 @x 都共享同一个名字 x 。


每个包都有自己的符号表。无论何时使用包声明,都要切换到该包的符号表,见 “
“包” 概念及 package 函数
” 。

从另一个包中访问另外一个包的变量,可通过“ 包名 + 双冒号( :: ) + 变量名 " 的方式指定。

由于 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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-26 04:21 , Processed in 0.163692 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表