Perl:在"使用严格"下的子例程中使用动态范围的变量

时间:2013-12-26 11:35:28

标签: perl

假设我有一个子程序printvar,我从另一个子程序main调用它。我可以灵活地使用

声明$var是词法范围的
my $var;

sub printvar {
  print "var is: $var";
}

sub main {
  $var = 5.0;
  printvar();
}

main();

或使用

动态范围化
sub printvar {
  print "var is: $var";
}

sub main {
  local $var = 5.0;
  printvar();
}

main();

但是当use strict生效时,第二个示例在编译时失败,有两条消息(一个在printvar,另一个在main):

Global symbol "$var" requires explicit package name

如果我想在$var中使用printvar作为全局,而不是将其作为参数传递,我希望printvar不关心$var来自哪个范围from,有没有办法在use strict下执行此操作?

回应@ mockinterface的回答:

使用our,我已经修改了第二个例子:

sub printvar {
  our $var;
  print "var is: $var";
}

sub main {
  our $var = 5;
  {
    local $var = 10;
    printvar();
  }
  printvar();
}

我看到输出

var is: 10
var is: 5

因此our $var中的printvar似乎是关键所在。

1 个答案:

答案 0 :(得分:2)

不,在您的方案中 - 使用严格,您只能使用our向/从全局范围提升或显式检索变量。

#!/usr/bin/perl -w

use strict;

sub printvar {
  our $var;
  print "var is: $var";
}

sub main {
  our $var = 5.0;
  printvar();
}

&main();