perl – 什么时候应该使用包变量和词法变量(有什么区别)?

我正在查看Perl Monks上的一些旧的Perl代码,以确定使用Win32 :: OLE和MS Word进行编程.整个代码中分散的是名为$MS :: Word之类的变量,其声明中没有包含“my”.在Google上阅读了一下之后,我明白这些被称为“包变量”与使用我的声明的“词汇变量”.

我的第一个问题是“什么是包装变量有用?”.我(想)我理解词汇变量是什么,但我不明白包变量的用途或者它们的用法与词汇有何不同,所以我的第二个问题是,’词法和包变量有什么区别?’

最佳答案
包变量存在于符号表中,因此根据其名称,可以从任何其他包或范围中读取或修改它.词汇变量的范围由程序文本确定. perlsub联机帮助页中的“Private Variables via my()”部分提供了有关定义词汇的更多详细信息.

假设我们有以下MyModule.pm:

package MyModule;

# these are package variables
our $Name;
$MyModule::calls = "I do not think it means what you think it means.";

# this is a lexical variable
my $calls = 0;

sub say_hello {
  ++$calls;

  print "Hello, $Name!\n";
}

sub num_greetings {
  $calls;
}

1;

请注意,它包含一个包$calls和一个lexical $calls.任何人都可以到达前者,但模块控制对后者的访问:

#! /usr/bin/perl

use warnings;
use strict;

use MyModule;

foreach my $name (qw/ Larry Curly Moe Shemp /) {
  $MyModule::Name = $name;
  MyModule::say_hello;
}

print MyModule::num_greetings, "\n";

print "calls = $MyModule::calls\n";

该程序的输出是

Hello, Larry!
Hello, Curly!
Hello, Moe!
Hello, Shemp!
4
calls = I do not think it means what you think it means.

正如您所看到的,包变量是全局变量,因此所有常见的问题和建议都不适用.除非明确提供访问权限,否则MyModule包之外的代码不可能访问其词法$调用.

经验法则是你几乎总是想要使用词法. Perl Best Practices by Damian Conway是直接的:“永远不要让变量成为模块界面的一部分”(强调原文).

转载注明原文:perl – 什么时候应该使用包变量和词法变量(有什么区别)? - 代码日志