符号表

第三章

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]$ 



                                    
原文地址:https://www.cnblogs.com/hzcya1995/p/13349765.html