【问题标题】:Which identifiers are considered to be dynamic?哪些标识符被认为是动态的?
【发布时间】:2017-03-27 12:22:18
【问题描述】:

以下摘自perldoc perlmod:

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

上面“不合格的动态标识符”短语中的“动态”一词似乎是指包中没有以my 为前缀的变量。也就是说,在下面的代码 sn-p 中,$v1 被认为是动态标识符。对吗?

package Package_1;

$v1 = "v1_val";

my $v2 = "v2_val";

【问题讨论】:

  • 如果由my $v1 在与sn-p 相同的文件中的package 语句上方声明,它也可以是词法变量。有关更多信息,请参阅 package 和 Scope of variables in Perl 的文档
  • @Chudong:我认为 dynamic 的概念在这里被滥用了。不清楚是 identifier 是动态的(所有 Perl 标识符都是静态的)还是标识符所指的 value (大多数 Perl 值是动态的)。你需要知道什么? What is the difference between my and our in Perl? 对您有帮助吗?
  • @Borodin,正如你所说,我想知道这里的“动态”一词是什么意思。

标签: perl dynamic identifier


【解决方案1】:

变量作用域的两种一般类型是动态和词法。基本上,词法变量的可见性是基于它们在源代码中的位置,而动态变量的可见性是在运行时确定的。

在 Perl 中,用 my 声明的变量是词法变量,而任何其他变量都是动态变量。这种区别直接相关的主要地方是local 只能与动态(非my)变量一起使用,而不能与词法(my)变量一起使用。

另请参阅 Perl 常见问题解答,What's the difference between dynamic and lexical (static) scoping?

【讨论】:

  • 戴夫,在你上面的回答中,在句子中,“在 Perl 中,用 my 声明的变量是词法的,而任何其他变量都是词法的”,你的意思是“动态的”,而不是“词法的” ,在后者?
  • @Chudong 是的,你理解正确。谢谢你抓住它!我已经更新了答案来修复它。
【解决方案2】:

查看差异的最好方法是在代码中:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-21
    • 2011-06-12
    • 1970-01-01
    • 2015-07-06
    • 2022-12-06
    • 2015-12-09
    • 1970-01-01
    相关资源
    最近更新 更多