2016-11-13 62 views
3

以下摘录从perldoc perlmod采取:哪些标识符被认为是动态的?

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

在“不合格动态标识符”短语的术语“动态”似乎是指未在封装与my前缀变量。也就是说,在下面的代码片段中,$v1被认为是一个动态标识符。是对的吗?

package Package_1; 

$v1 = "v1_val"; 

my $v2 = "v2_val"; 
+0

它也可以是一个词法变量,如果在'package'语句之上的'my $ v1'声明与片段相同的文件中声明的话。参见文档[包(http://perldoc.perl.org/functions/package.html)和[在Perl的变量范围](http://perlmaven.com/scope-of-variables-in-perl )更多信息 –

+0

@Chudong:我认为* dynamic *的想法在这里被滥用。目前还不清楚是否是*标识*是动态的(所有的Perl标识符是静态的)或*值*该标识符是指(大多数Perl值是动态的)。你需要知道什么? [[*] Perl和''''有什么区别?](http://stackoverflow.com/questions/845060/what-is-the-difference-between-my-and-our-in -perl/845382?s = 7)帮助你? – Borodin

+0

@Borodin,如你所说,我想知道这里“动态”这个词是什么意思。 – Chudong

回答

3

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

在Perl中,与my声明的变量是词汇和任何其他变量是动态的。这种区分变得直接相关的主要场所是local只能与动态(非my)变量,而不是与词汇(my)变量中。

参见Perl的常见问题,What's the difference between dynamic and lexical (static) scoping?

+0

Dave在上面的答案中,在句子中,“在Perl中,用my声明的变量是词法和任何其他变量都是词法的”,您是否确实在后者中表示“动态”,而不是“词法”? – Chudong

+0

@Chudong是的,你理解正确。感谢您的支持!我已经更新了解决方案。 –

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 

注意,子总是看到相同(室外)$static

相关问题