我知道my在Perl中是什么。它定义了一个只存在于定义它的块范围内的变量。我们该怎么做?

我们的和我的有什么不同?


当前回答

试着使用下面的程序:

#!/usr/local/bin/perl
use feature ':5.10';
#use warnings;
package a;
{
my $b = 100;
our $a = 10;


print "$a \n";
print "$b \n";
}

package b;

#my $b = 200;
#our $a = 20 ;

print "in package b value of  my b $a::b \n";
print "in package b value of our a  $a::a \n";

其他回答

处理作用域是对Perl作用域规则的一个很好的概述。它已经足够古老了,所以我们没有在正文中讨论。在最后的Notes一节中讨论了这个问题。

本文讨论包变量和动态作用域,以及它们与词法变量和词法作用域的区别。

这只是与问题有点相关,但我刚刚发现了一个(对我来说)模糊的perl语法,你可以使用“我们的”(包)变量,而不能使用“我的”(本地)变量。

#!/usr/bin/perl

our $foo = "BAR";

print $foo . "\n";
${"foo"} = "BAZ";
print $foo . "\n";

输出:

BAR
BAZ

如果你把“our”改成“my”,这就行不通了。

让我们思考一下解释器到底是什么:它是一段在内存中存储值的代码,并让它所解释的程序中的指令通过指令中指定的名称访问这些值。因此,解释器的主要工作是制定规则,规定我们应该如何在这些指令中使用名称来访问解释器存储的值。

在遇到“my”时,解释器创建一个词法变量:解释器只能在执行块时访问一个命名值,而且只能从该语法块中访问。在遇到“our”时,解释器会为包变量创建一个词法别名:它将一个名称绑定到具有相同名称的包变量的值上,从那时起解释器就应该将其作为词法变量的名称处理,直到块完成。

The effect is that you can then pretend that you're using a lexical variable and bypass the rules of 'use strict' on full qualification of package variables. Since the interpreter automatically creates package variables when they are first used, the side effect of using "our" may also be that the interpreter creates a package variable as well. In this case, two things are created: a package variable, which the interpreter can access from everywhere, provided it's properly designated as requested by 'use strict' (prepended with the name of its package and two colons), and its lexical alias.

来源:

http://perldoc.perl.org/functions/our.html http://perldoc.perl.org/perlsub.html Private-Variables-via-my ()

My用于局部变量,而our用于全局变量。

更多内容请参阅Perl中的变量作用域:基础知识。

print "package is: " . __PACKAGE__ . "\n";
our $test = 1;
print "trying to print global var from main package: $test\n";

package Changed;

{
        my $test = 10;
        my $test1 = 11;
        print "trying to print local vars from a closed block: $test, $test1\n";
}

&Check_global;

sub Check_global {
        print "trying to print global var from a function: $test\n";
}
print "package is: " . __PACKAGE__ . "\n";
print "trying to print global var outside the func and from \"Changed\" package:     $test\n";
print "trying to print local var outside the block $test1\n";

输出:

package is: main
trying to print global var from main package: 1
trying to print local vars from a closed block: 10, 11
trying to print global var from a function: 1
package is: Changed
trying to print global var outside the func and from "Changed" package: 1
trying to print local var outside the block 

如果使用"use strict"会在试图运行脚本时失败:

Global symbol "$test1" requires explicit package name at ./check_global.pl line 24.
Execution of ./check_global.pl aborted due to compilation errors.