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