我和我们之间的区别?(在同一文件中声明)

sat*_*sat 13 perl

在编写这个程序之前,我认为这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).

  • @aleroot:查看[tchrist]的个人资料(http://stackoverflow.com/users/471272/tchrist).我想你可以相信他的话 (3认同)

ale*_*oot 6

限制变量访问声明它们的最里面的块.如果没有块,则它们是文件范围的.

我们将一个简单的名称与当前包中的包变量相关联,因此它在包级别声明并链接到包名称.我们试图通过让你使用包变量而不添加包名来帮助我们.

package pack;
our $variable;    # These are the same
$pack::variable;  # These are the same
Run Code Online (Sandbox Code Playgroud)

一个我们的变量是类似C的静态变量的东西,但不同的是,因为变量声明为我们的功能仍然是函数外部访问,如果它被称为与变量的全名.

但是我的大部分都是词汇范围而我们是词汇范围,但他们的生活甚至在声明之外持久(他们的生活就像全球变量生活),因此要真正理解我们之间的差异你必须理解词汇之间的区别和全球作用于Perl.

简而言之,这两种类型之间的区别是:

全局变量

任何地方的任何代码都可以改变它们的价值.

词汇变量

变量的生命周期与代码块的末尾包含在一起,之后它们的值被垃圾收集.这些变量只能在声明它们的块中访问.


为了回答你具体的例子问题: 尝试将第二个包声明(包二)移动到另一个文件中,你会看到我们之间的区别......

  • 这是错的.`我们的`声明*不是*全局 - 只有包变量是.`perl -Mstrict -e"我们的$ x = 1; {我们的$ y = 2;};打印$ x;打印$ y"`说`全局符号'$ y"需要-e line 1的显式包名. (2认同)