perl如何唯一地识别包变量?

时间:2013-05-24 03:09:50

标签: perl variables

您好我是Perl编程的新手,我刚刚在Perl中遇到过这些类型的变量: 包和词汇

到目前为止我了解到这是一个包变量:

$Santa::Helper::Reindeer::Rudolph::nose

所以我的问题是,Perl如何知道我是否在该包中引用$nose, or @nose or %nose

如果我声明另一个名为

的变量(一个词法),这也是有效的

$nose or @nose or %nose使用我的

示例:my $nose;

2 个答案:

答案 0 :(得分:5)

$Santa::Helper::Reindeer::Rudolph::nose

$nose

@Santa::Helper::Reindeer::Rudolph::nose

@nose

如果程序包通过声明our $nose使用词法范围变量,并且在代码中声明使用该程序包的my $nose,则会破坏它。如果您use strictuse 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