我在看这个question ,当我在玩的时候,我遇到了这个:
#! /usr/bin/env perl
#
# use warnings;
use strict;
use feature qw(say);
{
our $foo = "bar";
say "Foo = $foo";
}
say "Foo = $foo"; # This is line #12
是的,我确实关闭了use warnings;
...
当我运行它时,我得到:
Variable "$foo" is not imported at ./test.pl line 12.
Global symbol "$foo" requires explicit package name at ./test.pl line 12.
Execution of ./test.pl aborted due to compilation errors.
嗯...我得到相同的“变量“$foo”未在 ./test.pl 第 12 行导入。”如果我完成了 my $foo =“栏”;
。当我使用 my
时我会理解这一点,因为一旦我们离开 block ,就没有变量 $foo
了。但是,我们的
变量被假定为包范围。我能理解 $foo
在那个时候可能没有值(value),但是这个?
此外,“变量“$foo”未在 ./test.pl 第 12 行导入。”是什么意思?我了解包和导入,但这里只有一个包,main
。 $foo
应该在 main
包中。它不需要导入。
我的包变量在超出范围后似乎不在包中是怎么回事?
附录
So if you used
$::foo
, or created another alias withour $foo;
again, your program would work as expected. cmj
让我们试试这个...
#! /usr/bin/env perl
#
# use warnings;
use strict;
use feature qw(say);
{
our $foo = "bar";
say "Foo = $foo";
}
our $foo; # Redeclared
say "Foo = $foo"; # This is line #12
现在,打印出来:
bar
bar
正如每个回答的人所指出的,我们的
只是为同名的包变量创建了一个别名,并且它是词法 范围的。这意味着一旦别名超出范围,我也无法使用 $foo
访问 $main::foo
的值。这是我以前从未意识到的。
但是,正如 cjm 指出的那样,重新声明 our $foo;
会恢复别名,并且已经存在的 $main::foo
被别名为新的 $foo
。当我重新声明 our $foo;
时,$foo
的值恢复。
这是关于我们的
变量的事情之一,它可能会如此令人困惑。您看到一个声明 our $foo;
,突然之间,该变量不仅存在,而且还具有一个神秘的值。您必须搜索该程序以查看该值可能来自何处。
最佳答案
Our声明包变量的词法别名。这意味着它的范围就像 my
一样。不同之处在于它由一个包变量支持,因此当您退出作用域时该变量不会消失。只有别名消失了。
因此,如果您使用 $::foo
,或再次使用 our $foo
创建另一个别名,您的程序将按预期运行。
关于perl - Perl 中的包变量不在 "scope"中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22201050/