以下摘录摘自CMake manual:
package
语句将编译单元声明为在给定的命名空间中。eval
声明的范围来自声明本身到封闭块my
或文件的末尾,以先到者为准(与local
()的范围相同,且{ {1}}()运算符)。不合格的动态标识符将位于此命名空间中,除了那些少数标识符(如果不合格),默认为主包而不是当前包,如下所述。
术语"动态"在"不合格的动态标识符"上面的短语似乎是指包中没有my
前缀的变量。也就是说,在下面的代码段中,$v1
被视为动态标识符。是吗?
package Package_1;
$v1 = "v1_val";
my $v2 = "v2_val";
答案 0 :(得分:3)
两种常规类型的变量范围是动态和词汇。基本上,词汇变量的可见性取决于它们在源代码中的位置,动态变量的可见性是在运行时确定的。
在Perl中,用my
声明的变量是词法的,任何其他变量都是动态的。这种区别直接相关的主要地方是local
只能与动态(非my
)变量一起使用,而不能与词法(my
)变量一起使用。
另请参阅Perl常见问题解答,What's the difference between dynamic and lexical (static) scoping?
答案 1 :(得分:1)
查看差异的最佳方法是在代码中:
our $dynamic = 'outside';
my $static = 'outside';
sub show {
print "\tin sub: dynamic $dynamic\n";
print "\tin sub: static $static\n";
print"\n";
}
{
local $dynamic = 'inside';
my $static = 'inside';
print "In block\n";
print "\tinline: dynamic $dynamic\n";
print "\tinline: static $static\n";
show();
}
print "In main\n";
print "\tinline: dynamic $dynamic\n";
print "\tinline: static $static\n";
show();
输出:
In block
inline: dynamic inside
inline: static inside
in sub: dynamic inside
in sub: static outside
In main
inline: dynamic outside
inline: static outside
in sub: dynamic outside
in sub: static outside
请注意,sub始终看到相同(外部)$static
。