试图了解范围解析运算符。
$a = 5;
foo();
print "Out a = $a\n";
sub foo() {
local $a = 10;
bar();
}
sub bar() {
print "Inside a = $a\n";
print "Global a = $::a\n";
}
该计划的输出是:
Inside a = 10
Global a = 10
Out a = 5
我希望'$ :: a'的值为'5'而不是10.我认为这是范围解析运算符的作用。获取范围值。在这种情况下,没有给出范围,因此具有全球价值。如果有任何调整,请纠正我。
我应该写什么来获得条形子程序中'a'的全局值?
答案 0 :(得分:8)
好吧,首先关闭 - 不要使用$a
- 单字母变量名称通常是讨厌的,当sort
使用它时会变为双倍。
其次local
不符合你的想法。它甚至在手册页中说:
你真的可能想要使用我的,因为本地并不是大多数人认为的“本地”。有关详细信息,请参阅perlsub中的my()私有变量。
本地修改列出的变量是封闭块,文件或eval的本地变量。如果列出了多个值,则列表必须放在括号中。有关详细信息,请参阅perlsub中local()的临时值,包括绑定数组和散列的问题。
所以你可能想要使用my
,但是......实际上,你可能只是希望不这样做,并且不要t根本不使用全局变量。
#!/usr/bin/env perl
use strict;
use warnings;
our $number = 5;
foo();
print "Out number = $number\n";
sub foo {
my $number = 10;
print "Inside foo: $number\n";
print "Global foo $::number\n";
bar();
}
sub bar {
print "Inside bar = $number\n";
print "Global $::number\n";
}
正如你所看到的那样 - $number
在词法上被限定为“在foo之内”并且不会持久存在于b中。
Inside foo: 10
Global foo = 5
Inside a = 5
Global a = 5
Out number = 5
第三 - 不要在潜艇上使用原型。他们没有做你认为他们做的事。
答案 1 :(得分:7)
你误解了::
。 Perl实际上没有全局变量(不考虑某些特殊的标识符名称);它有包变量。也就是说,每个全局变量都属于一个包。如果您的代码没有package
语句,则该程序包为main
,因此$a
与$main::a
相同。在::
之前没有任何内容是main
的简写,因此$::a
也是$main::a
。
如果您确实有package
声明,则除非通过::
限定,否则其范围内使用的包变量将包含在该包中。
local
为包变量或散列或数组元素提供临时值,并保留在保留最内层范围时要恢复的先前值。
无法从本地范围内访问该已保存的值。
全局/包变量的反义词是词法变量。你几乎总是想要使用词法变量(用my
声明),而不是包变量。即使您使用包变量,也几乎不想使用local
更改其值。因此,使用local
的一个好例子将是非常罕见的。