哪些标识符被认为是动态的?

时间:2016-11-13 21:25:59

标签: perl dynamic identifier

以下摘录摘自CMake manual

  

package语句将编译单元声明为在给定的命名空间中。 eval声明的范围来自声明本身到封闭块my或文件的末尾,以先到者为准(与local()的范围相同,且{ {1}}()运算符)。不合格的动态标识符将位于此命名空间中,除了那些少数标识符(如果不合格),默认为主包而不是当前包,如下所述。

术语"动态"在"不合格的动态标识符"上面的短语似乎是指包中没有my前缀的变量。也就是说,在下面的代码段中,$v1被视为动态标识符。是吗?

package Package_1;

$v1 = "v1_val";

my $v2 = "v2_val";

2 个答案:

答案 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