我正在查看
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是直接的:“永远不要让变量成为模块界面的一部分”(强调原文).