伙计们,我有点困惑,当我遇到这个问题时,我正在Perl中进行作用域定义:
#! usr/bin/perl
use warnings;
use strict;
sub nested {
our $x = "nested!";
}
print $x; # Error "Variable "$x" is not imported at nested line 10."
print our $x; # Doesn't print "nested!"
print our($x) # Doesn't print "nested!"
但是当我这样做时:
{
our $x = "nested";
}
print our($x); # Prints "nested"
print our $x; # Prints "nested"
print $x; # Prints "nested"
你们可以向我解释为什么这些方法行不通吗?
最佳答案
our
说明这就解释了为什么第二个示例的前两张图片有效(我们在print的范围内重新声明了),而第三张却不起作用(因为我们唯一的别名$ x是该块范围内的package变量)。请注意,打印
$main::x
将使正常工作-只是范围内的别名,而不是包变量本身。print our $x;
和print our($x)
“不起作用”-即正确声明该值未初始化-因为您从未调用过用于初始化变量的函数。观察差异:c:\>perl -e "use strict; use warnings; sub x { our $x = 1;} print our $x"
Use of uninitialized value $x in print at -e line 1.
c:\>perl -e "use strict; use warnings; sub x { our $x = 1;} x(); print our $x"
1
print $x;
的工作原理与该块不一样-our
仅将别名的作用域限定在该块(即子实体的这种情况下),因此您必须在主块的作用域中对它进行别名(按照print our $x
的规定)例如),或者在子外部使用完全合格的程序包全局,在这种情况下,它将按预期方式运行:c:\>perl -e "use strict; use warnings; sub x { our $x = 1;} print $main::x"
Use of uninitialized value $x in print at -e line 1.
c:\>perl -e "sub x { our $x = 1;} x(); print $main::x"
1