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

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

概述我正在查看 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 variablesour $name;$MyModule::calls = "I do not think it means what you think it means.";# this is a lexical variablemy $calls = 0;sub say_hello {  ++$calls;  print "Hello,$name!\n";}sub num_greetings {  $calls;}1;

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

#! /usr/bin/perluse 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!4calls = I do not think it means what you think it means.

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

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

总结

以上是内存溢出为你收集整理的perl – 什么时候应该使用包变量和词法变量(有什么区别)?全部内容,希望文章能够帮你解决perl – 什么时候应该使用包变量和词法变量(有什么区别)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1267899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存