我知道my在Perl中是什么。它定义了一个只存在于定义它的块范围内的变量。我们该怎么做?
我们的和我的有什么不同?
我知道my在Perl中是什么。它定义了一个只存在于定义它的块范围内的变量。我们该怎么做?
我们的和我的有什么不同?
当前回答
一个例子:
use strict;
for (1 .. 2){
# Both variables are lexically scoped to the block.
our ($o); # Belongs to 'main' package.
my ($m); # Does not belong to a package.
# The variables differ with respect to newness.
$o ++;
$m ++;
print __PACKAGE__, " >> o=$o m=$m\n"; # $m is always 1.
# The package has changed, but we still have direct,
# unqualified access to both variables, because the
# lexical scope has not changed.
package Fubb;
print __PACKAGE__, " >> o=$o m=$m\n";
}
# The our() and my() variables differ with respect to privacy.
# We can still access the variable declared with our(), provided
# that we fully qualify its name, but the variable declared
# with my() is unavailable.
print __PACKAGE__, " >> main::o=$main::o\n"; # 2
print __PACKAGE__, " >> main::m=$main::m\n"; # Undefined.
# Attempts to access the variables directly won't compile.
# print __PACKAGE__, " >> o=$o\n";
# print __PACKAGE__, " >> m=$m\n";
# Variables declared with use vars() are like those declared
# with our(): belong to a package; not private; and not new.
# However, their scoping is package-based rather than lexical.
for (1 .. 9){
use vars qw($uv);
$uv ++;
}
# Even though we are outside the lexical scope where the
# use vars() variable was declared, we have direct access
# because the package has not changed.
print __PACKAGE__, " >> uv=$uv\n";
# And we can access it from another package.
package Bubb;
print __PACKAGE__, " >> main::uv=$main::uv\n";
其他回答
我们的和我的有什么不同,我们做什么?
总而言之:
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变量而没有惩罚(即,没有导致错误)。范围可以是一个、两个或多个包,或者一个小块。
#!/usr/bin/perl -l
use strict;
# if string below commented out, prints 'lol' , if the string enabled, prints 'eeeeeeeee'
#my $lol = 'eeeeeeeeeee' ;
# no errors or warnings at any case, despite of 'strict'
our $lol = eval {$lol} || 'lol' ;
print $lol;
处理作用域是对Perl作用域规则的一个很好的概述。它已经足够古老了,所以我们没有在正文中讨论。在最后的Notes一节中讨论了这个问题。
本文讨论包变量和动态作用域,以及它们与词法变量和词法作用域的区别。
来自cartman和Olafur的PerlMonks和PerlDoc链接是一个很好的参考-下面是我的总结:
我的变量在词法上是在一个由{}定义的块中,如果不在{}s中,则在同一个文件中。它们不能从同一词法作用域/块之外定义的包/子例程中访问。
变量的作用域在包/文件内,可以从任何使用或要求包/文件名称冲突通过预挂适当的名称空间来解决的代码中访问。
只是为了完善它,局部变量是“动态”范围的,与我的变量不同的是,它们也可以从同一块中调用的子例程中访问。
My用于局部变量,而our用于全局变量。
更多内容请参阅Perl中的变量作用域:基础知识。