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

perl变量作用域以及定义方式。

发布时间:2020-12-16 00:17:23 所属栏目:大数据 来源:网络整理
导读:问:Perl中以my开头的语句,my是什么作用? 答(一): 像C语言中有作用域的概念,比如一个在函数中定义的变量,在函数外是无效的。 perl也有作用域的概念,perl定义的变量默认是全局的,当在定义变量时使用 my $abc,那么$abc的作用域就限定在当前函数体或当前

问:Perl中以my开头的语句,my是什么作用?

答(一): 像C语言中有作用域的概念,比如一个在函数中定义的变量,在函数外是无效的。
perl也有作用域的概念,perl定义的变量默认是全局的,当在定义变量时使用
my $abc,那么$abc的作用域就限定在当前函数体或当前for循环中。
乃局部变量。

答(二):?our,"把名字限于某个范围“,其实就是明确声明一个"全局变量",虽然是在某个模块或者函数里面定义的,外面的也可以访问,如果已经声明过了,再次用"our",表示此处用的是全局的那个,不是同名的私有或者局部变量。
?
our $PROGRAM_NAME = "waiter";
{
my??$PROGRAM_NAME = "something";
our $PROGRAM_NAME = "server"; #这里的our和外面的相同,和前句不同。
# 这里调用的代码看到的是"server"
}
# 这里执行的代码看到的仍然是"server".
?
my,"把名字和值都限于限于某个范围",简单说,就是只能本层模块或者函数可以看到这个变量,高一层的或者低一层的都看不到的。
sub greeting1{
????my ($hello) = "How are you do?";
????greeting2();
?}
sub greeting2{
????print "$hellon";
$hello = "How are you doing?";
greeting2();
greeting1();
运行结果:
How are you doing?
--------------------------
一个 How are you do? 都没有,在greeting1中call greeting2时,greeting2看不到greeting1的私有 $hello变量,只能看到外面的全局变量$hello
local,"把值局限于某个范围",也有叫"动态词法范围",有点不好懂。我的理解,就是本层和本层下层的函数可以看到本层的变量,但是本层上一层的不可以。到底范围是多少,不仅取决于本层的函数,还要看下一层的程序长度和深度,所以叫"动态范围"。
?
????local ($hello) = "How are you do?";
How are you do?
-----------------------
跟用 my 时不一样了吧? 此时在greeting1调用greeting2时,greeting2可以看到greeting1的局部变量$hello,外部的全局变量当然就隐藏了。

?

?

Perl中的变量作用范围 local,my,our与全局变量 [ZZ from:http://shake863.javaeye.com/blog/189799] 很古老很古老以前......嗯,不用老到白垩纪,那时候的Perl是自由射击的。没有什么定义变量的说法,所有的变量都是全局变量,也不需要任何 定义就可以使用。后来就出现了local,再后来出现了use strict 'vars'和my,再后来又有了our......所以今天的Perl大陆就有了崇山巨岭,一些变量就被限制在盆地里,老死于桃花源中也。 因为要使用一个跨模块全局变量,研究了一下Perl的变量作用范围,写一点笔记吧。 1. 首先说our,这个最晚出现但其实质却最早出现的变量修饰符。众所周知,在Perl不使用use strict 'vars'的时候,你可以任意使用变量而不需要实现定义: $szStateMachineStatus = undef; 这行代码在使用了use strict 'vars'以后是编译不能通过的。如果这个变量是一个全局变量,那么可以定义 our $szStateMachineStatus = undef; 这个效果和在不使用use strict 'vars'时一样。"一样"意味着什么呢? our $szStateMachineStatus = 'init'; { $szStateMachineStatus = 'inited'; print $szStateMachineStatus; } print $szStateMachineStatus; 打印的结果是两个'inited'。顺便说,用our定义过的变量,可以在任何地方被再次用our定义,仍然和第一个our定义的变量是同一个。 2. my 慢慢地有人觉得Perl的"自由射击式"变量定义法则不行,最突出的就是一些常会打错字(typo)的人。假如你定义了一个变量叫$ szStateMachineStatus,可是在某个地方写成了$szStatMachineStatus,少了一个e。因为不use strict啊,所以没有任何警告,可以这样用。结果就是出了错你就慢慢debug去吧,很浪费时间,不符合Perl的懒惰文化。 然后就有了use strict 'vars'和my。有了use strict 'vars'以后,所有的变量在使用前必须先被定义。my的法则很简单,只在当前作用域起作用。比如说定义了 my $szStateMachineStatus; 那么如果是在文件头定义的,作用范围就到文件尾,在子函数里也能用。如果是在子函数里定义的,那么作用范围就只到函数结束。试看以下代码 foreach my $szName (@arrName){ print $szName; } 在这个循环里Perl每次都创建一个新的$szName变量。换句话说,"my"是属于"见到my就新建"的变量。 3. local 其实这个定义都可以取消了。它是在my还没出现之前的一个权宜方案。比如说一个变量$i被定义成了全局变量,可是你又想暂时使用一个也叫$i的临时变量。 no strict 'vars'; $i = 9999; { local $i = 7777; print "$in"; } print "$in"; 结果是7777,9999。在出了local的作用域以后$i又回到了原来的值。在出现了my以后,没有任何理由需要使用local了,请忘记掉它吧。 4. 最后一个话题,全局变量 当你只有一个pl文件时,很简单,把你的全局变量在文件头部定义成our就行。可能你会看到有些书上说要使用use vars qw( $szVersion $szToolName); 这样的方式来把 $szVersion和$szToolName定义成全局变量。注意了,use vars的用法是在my出现后,our出现之前的一个历史的盲肠。our的语法更自然,更易于理解,为什么不用our呢? --另外,在文件头把变量定义成my,也是全局可用的,但是冒了风险,假如在某个函数里用my再定义一次,原来的值可就消失了。用our就不存在多次定义会导致丢值的状况。 当你在写一个有一个pl文件,N个pm文件的系统时该如何呢?事实上Perl里的变量和函数名都有一个系统级的名字。比如说你在某pm文件的头上定义了包名和全局变量 package bagua; our $east = 'wood'; 那么在任何地方,任何pm和pl文件里都可以使用$bagua::east来访问这个变量。$bagua::east就被称为系统级名字。这也能回答一个问题,为什么不同的perl包里面定义的同名全局变量间不会冲突,因为它们都被限制在包的名字空间下面了。 如果你是在pl里定义全局变量,而且该文件没有定义package名字怎么办?Perl会生成一个缺省的package,名字叫"main"。所以如果你的pl文件是这样 our $szVersion = '1.0.1"; 那么在其它文件里就可以用$main::szVersion来访问,并不需要你定义package main. 最后,说一个邪门招式。你可以试一下定义任意一个含有::的变量 our $gColor::Blue = '0x0000FF'; 这个变量就在任何地方可用,哪怕你从来没有定义过gColor这个package。这个是Perl的灵活性的体现,它看到这个就自动生成了gColor这个名字空间。当然,我不鼓励这种无厘头的用法。

(编辑:李大同)

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

    推荐文章
      热点阅读