perl – 什么时候应该使用包变量和词法变量(有什么区别)?
发布时间:2020-12-15 23:29:12 所属栏目:大数据 来源:网络整理
导读:我正在查看 Perl Monks上的一些旧的Perl代码,以确定使用Win32 :: OLE和MS Word进行编程.整个代码中分散的是名为$MS :: Word之类的变量,其声明中没有包含“my”.在Google上阅读了一下之后,我明白这些被称为“包变量”与使用我的声明的“词汇变量”. 我的第一
我正在查看
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::callsn"; 该程序的输出是 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是直接的:“永远不要让变量成为模块界面的一部分”(强调原文). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |