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

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


当前回答

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

#!/usr/bin/perl

our $foo = "BAR";

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

输出:

BAR
BAZ

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

其他回答

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.

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

#!/usr/bin/perl

our $foo = "BAR";

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

输出:

BAR
BAZ

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

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

总而言之:

my是一种声明非包变量的方法,它们是:

私人 新 非全局 与任何包分开,这样变量就不能以$package_name::variable的形式访问。


另一方面,我们的变量是包变量,因此自动:

全局变量 绝对不是私人的 不一定是新的 可以在包(或词法范围)之外使用 限定的命名空间,如$package_name::variable。


使用our声明变量允许您预先声明变量,以便在use strict下使用它们,而不会得到拼写警告或编译时错误。从Perl 5.6开始,它取代了过时的vars, vars只是文件作用域,而不像我们的那样是词汇作用域。

例如,main包中变量$x的正式限定名是$main::x。声明我们的$x允许你在声明的范围内,当脚本使用use strict或使用strict“vars”时,使用纯$x变量而没有惩罚(即,没有导致错误)。范围可以是一个、两个或多个包,或者一个小块。

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

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

试着使用下面的程序:

#!/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";