第章 Typeglob和符号表

perl 变量,符号表和作用域:


Perl 有一个在其他语言中一般见不到的奇怪恶性,你可以使用同样的名字来标识数据或非数据类型。


例如,标量变量$spud,数组@spud,散列表%spud,子例程&spud


Perl 使用符号表来把标示符名(就是去掉前缀的"spud"字符串)映射到相应的值。


Typeglob 是一种可以在脚本程序中使用的真实的数据类型,它拥有前缀"*",

尽管你可以把它相像成一种代表所有值的通配符



词法与动态作用域的比较:


有两种方式将私有数值传入子例程或代码块,第一种是使用local操作符,但它只限于全局变量,

它先将变量值保存,然后在代码块结束时再恢复原有值。

另外一种方式就是my,它不但又新建了一个变量,而且还把它置为只对代码块可见


zjzc01:/root/hei# cat a21.pl 
$a=20;    #全局变量
{
  local $a; #先保存$a原先的值,新值为undef
  my (@b);    #Lexical 变量
  $a=10;      #改变$a的新值
  @b=("wallance","grommit");
print $a;     #打印结果为10
print "@b";   #打印结果为"wallance grommit";
};
##代码块结束,又回到全局域中,此时只有$a有效
print $a;    ##打印出20
print @b;


由于local语句使得该全局变量在代码块终结时被释放并以原来的值重新创建



虽然它们的用法相同,但是local和my之间有一个很重要的差别。my声明将创建真正的局部变量,


这有点像C语言中的自动变量。变量只在声明它的代码块中可见(代码块从词法上定义了这种界限)

这对代码块中调用的其他字例程来说是无效的。



于my不同,local 操作符并不创建新的变量,当你把它作用域全局变量时,它就会把他全局变量的值隐藏起来,

并在代码块终结时予以恢复。


换句话说 就是local 以临时的方式保存当前的新值,它并没有改变变量的本质(变量仍然是全局变量).


而my则创建新的局部变量






Typelob

我们前面提到typeglob 可以被局部化(只能使用local),还可以相互赋值。通过typeglob赋值可以创建标示符的别名:

zjzc01:/root/hei# cat a22.pl 
$spud = "Wow!";
@spud=("idaho","russet");
*potato = *spud;
print "$potato  is $potato
";
print "@potato is @potato
";
zjzc01:/root/hei# perl a22.pl 
$potato  is Wow!
@potato is idaho russet


使用typeglob别名:


高效的参数传递:

因为别名不存在间接访问操作,因此它套比引用的速度快一些。例如:

zjzc01:/root/hei# cat a23.pl 
$a = 10;
*b = *a; $b++;  #1. 通过typeglob方式间接的使$a加一
print "$a is $a
";
$r=$a;$$r++;   #2.通过引用方式间接的使$a加一
print "$a is $a
";


zjzc01:/root/hei# perl a23.pl 
$a is 11
$a is 12







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