加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读