perl - Perl 中的包变量不在 "scope"中?

标签 perl perlvar

我在看这个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 with our $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/

相关文章:

Perl 5.8.8 - Curses 界面 - 多选 - 这可能吗?

perl - %INC 的键和值是否依赖于平台?

perl - 排序是否有助于 Perl 中 grep 的效率

perl - 切换到一个目录,然后 getcwd()

perl - Perl中是否有正则表达式来查找文件的扩展名?

perl - %ICN 和 @INC 有什么区别?

regex - 返回多行正则表达式匹配的行号

perl - Perl 中默认变量 $_ 的作用域

perl - $_ 与命名输入或循环参数有何不同?