Perl语言再学习(5): 定义与作用域

看上去这应该是个挺简单的话题,但是并非如此。
而且在某些关键概念上搞不清楚常常容易出问题。

声明与定义(declarations and definitions)

perl其实允许像C那样将函数的声明与定义分开。 当一个函数提供了一个可以执行的代码块时, 就会被识别为一个函数定义,而不是函数声明。

sub count(@);
my $x;
$x = count(3, 2, 1);
sub count(@) {@_;}

全局定义

函数默认是全局定义的

package Bar;
sub foo {
	return 1;
}
1;

可以在其他包中被调用 Bar::foo();

局部定义

例:

my ($a, @b, %c);
our ($d, @e, %f);
local (*g, $h{i});

例:

my $a;
{
	my $b;
	sub {my $c = $a + $b; return $c;}
}

例:

{
	local $var = $newvalue;
	foo();
}

又一例:

{
	$oldvalue = $newvalue;
	$var = $newvalue;
	some_func();
}
continue {
	$var = $oldvalue;
}

有意思的是以local关键字定义的变量在以任何方式退出这个作用域时,都会恢复之前的值。 这也就是它为什么被称作dynamic scoping的原因,有点压栈弹栈的感觉。

总结: