第三章
Typeglob和符号表:
本章将讨论typeglob,符号表,文件句柄,打印格式以及动态作用域与词法作用域的差异。
Perl 变量,符号表和作用域:
变量要么就是全局的,要么就是词法的(lexical,指那些以my语句限定的变量)
Perl 为每一种类型的实体提供不同的名字空间。
Perl 使用符号表来标识符号(就是去掉前缀的"spud"字符串)映射到相应的值。
但是散列表不允许重复键值.
Typeglob 是一种可以在脚本程序中使用的真实的数据类型,它拥有前缀"*".
监管你可以把它想象成一种代表所有值的通配符,这些值拥有相同的标志
[oracle@oadb 3]$ cat a1.pl
$ref=*var;
$var=10;
print $$ref;
print "
";
@var=(1,2,3,4);
print @$ref;
print "
";
[oracle@oadb 3]$ perl a1.pl
10
1234
词法于动态作用域的比较:
有两种方式将私有数值传入子程序或代码块。
第一种是使用local操作符,但它只限于全局变量,它先进变量值保存,然后在代码块结束时再回复原有值。
[oracle@oadb 3]$ cat a2.pl
$a=20; ##全局变量
{
local $a; #先保存$a原来的值,新值为undef
$a=10;
print "1111111$a=$a";
print "
";
};
print "2222222$a=$a";
print "
";
[oracle@oadb 3]$ perl a2.pl
1111111$a=10
2222222$a=20
Typeglob
我们前面提到typeglob 可以被局部化(只能使用local),还可以相互赋值。通过typeglob赋值可以创建标识符的别名:
[oracle@oadb 3]$ cat a3.pl
$spud="Wow!";
@spud=("idhao","russet");
*potato=*spud;
print $potato."
";
print @potato;
print "
";
[oracle@oadb 3]$ perl a3.pl
Wow!
idhaorusset
临时别名:
目前暂时还没有一种简单而直观的方法,用于删除由typeglob赋值产生的别名
Typeglob与引用:
你或许已经注意到typeglob和引用均指向值,变量$a可以被简单的视为一个
typeglob的间接访问${*a}
[oracle@oadb 3]$ cat a4.pl
$spud="Wow!";
@spud=("idhao","russet");
*a=*spud;
print $a."
";
print @a;
print "
";
[oracle@oadb 3]$ perl a4.pl
Wow!
idhaorusset
为匿名子例程起名:
你如果觉得间接的通过引用来调用子例程(&$rs())很不舒服的话,那么你可以赋给它一个名字以求方便。
1[oracle@oadb 3]$ cat a5.pl
sub generate_greeting {
my $greeting=shift;
return sub{print "$greeting world
";}
};
$rs=generate_greeting("hello");
print &$rs;
*greet=$rs;
print greet();
[oracle@oadb 3]$ perl a5.pl
hello world
1hello world
1[oracle@oadb 3]$