在编写这个程序之前,我认为这our是一个包范围变量,并且my是一个文件范围变量.但是,在完成该程序后,我感到困惑.
我的节目是,
#!/usr/bin/perl
use strict;
use warnings;
package one;
our $val = "sat";
my $new = "hello";
print "ONE:val =>$val \n";
print "ONE:new =>$new \n\n";
package two;
print "TWO:val =>$val \n";
print "TWO:new =>$new \n";
Run Code Online (Sandbox Code Playgroud)
哪个输出
ONE:val =>sat
ONE:new =>hello
TWO:val =>sat
TWO:new =>hello
Run Code Online (Sandbox Code Playgroud)
那么,my和之间our有什么区别.两者是相同还是有任何区别?
tch*_*ist 20
正如你看到的,my并且our有词法效果.
my 创建一个词法范围的变量.
our为包变量创建一个词法范围的别名.
仅仅因为你说package没有任何方式改变词汇范围,所以即使在看过声明后你$val仍然是别名.$one::valpackage two
如果您没有看到近似卷曲,则表示您尚未完成范围.(或EOF或字符串中的字符串结尾eval).
我限制变量访问声明它们的最里面的块.如果没有块,则它们是文件范围的.
我们将一个简单的名称与当前包中的包变量相关联,因此它在包级别声明并链接到包名称.我们试图通过让你使用包变量而不添加包名来帮助我们.
package pack;
our $variable; # These are the same
$pack::variable; # These are the same
Run Code Online (Sandbox Code Playgroud)
一个我们的变量是类似C的静态变量的东西,但不同的是,因为变量声明为我们的功能仍然是函数外部访问,如果它被称为与变量的全名.
但是我的大部分都是词汇范围而我们是词汇范围,但他们的生活甚至在声明之外持久(他们的生活就像全球变量生活),因此要真正理解我和我们之间的差异你必须理解词汇之间的区别和全球作用于Perl.
简而言之,这两种类型之间的区别是:
任何地方的任何代码都可以改变它们的价值.
变量的生命周期与代码块的末尾包含在一起,之后它们的值被垃圾收集.这些变量只能在声明它们的块中访问.
为了回答你具体的例子问题: 尝试将第二个包声明(包二)移动到另一个文件中,你会看到我和我们之间的区别......
| 归档时间: |
|
| 查看次数: |
2463 次 |
| 最近记录: |