【问题标题】:how does perl uniquely identify package variables?perl 如何唯一标识包变量?
【发布时间】:2013-05-24 03:09:49
【问题描述】:

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

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

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

所以我的问题是,Perl 怎么知道我指的是那个包中的$nose, or @nose or %nose

如果我用名称声明另一个变量(词法变量),这是否也有效

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

示例:my $nose;

【问题讨论】:

  • 因为在该包内可能有 3 种不同类型的同名变量 - 鼻子

标签: perl variables


【解决方案1】:
$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不受影响。

【讨论】:

  • 如果我使用my声明另一个名为nose的变量呢?
  • 我可以使用my $nose的打包声明以及my $nose的代码吗?
  • 是的,只需通过$Santa::Helper::Reindeer::Rudolph::nose 参考包裹的$nose$nose 的您的$nose
【解决方案2】:

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

【讨论】:

  • 所以$Santa::Helper::Reindeer::Rudolph::nose = 123;our $nose 是一样的吗?
  • 不,一个是赋值,另一个是变量声明。不过,后者中的变量与前者中的变量有别名。
  • 如果我给our $nose 分配一些东西,$nose 的包也会改变吗? our 是否仅用于重新声明(别名)一个包?
  • 它会改变$Santa::Helper::Reindeer::Rudolph::nose,不一定是当前包的$nosepackage 是声明包的唯一方法。 use vars 是声明包变量的唯一方式。
  • 非常有描述性的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多