伙计们,我有点困惑,当我遇到这个问题时,我正在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"

你们可以向我解释为什么这些方法行不通吗?

最佳答案

  • 要说明块示例为何按其方式工作,让我们看一下"Modern Perl" book, chapter 5中的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
    
  • 10-08 15:48