您好我是Perl编程的新手,我刚刚在Perl中遇到过这些类型的变量: 包和词汇
到目前为止我了解到这是一个包变量:
$Santa::Helper::Reindeer::Rudolph::nose
所以我的问题是,Perl如何知道我是否在该包中引用$nose, or @nose or %nose
?
如果我声明另一个名为
的变量(一个词法),这也是有效的 $nose or @nose or %nose
使用我的:
示例:my $nose;
答案 0 :(得分:5)
$Santa::Helper::Reindeer::Rudolph::nose
是$nose
@Santa::Helper::Reindeer::Rudolph::nose
是@nose
如果程序包通过声明our $nose
使用词法范围变量,并且在代码中声明使用该程序包的my $nose
,则会破坏它。如果您use strict
和use warnings
(您应该总是这样),那么当发生这种情况时会发出警告:"my" variable $nose masks earlier declaration in same scope
。如果程序包通过声明my $nose
使用私有变量,那么您也可以在代码中声明my $nose
,并且程序包的$nose
将不受影响。
答案 1 :(得分:4)
在package Santa::Helper::Reindeer::Rudolph;
范围内时,
$nose
是$Santa::Helper::Reindeer::Rudolph::nose
和
@nose
是@Santa::Helper::Reindeer::Rudolph::nose
的缩写。
也就是说,除非您已创建范围内的词法变量(使用my $nose;
或our $nose;
)。如果是这样,那么您最后声明的变量就是使用的变量。
package Santa::Helper::Reindeer::Rudolph;
$Santa::Helper::Reindeer::Rudolph::nose = 123;
print "$nose\n"; # 123
my $nose = 456; # Creates new lexical var
print "$Santa::Helper::Reindeer::Rudolph::nose\n"; # 123
print "$nose\n"; # 456
{
my $nose = 789; # Creates new lexical var
print "$nose\n"; # 789
}
print "$nose\n"; # 456
our $nose; # Creates lexical var aliased to $S::H::R::R::nose
print "$nose\n"; # 123