Perl:在子例程中使用动态作用域变量;使用“严格的”;

Perl:在子例程中使用动态作用域变量;使用“严格的”;,perl,Perl,假设我有一个子例程printvar,我从另一个子例程main调用它。我可以灵活地使用 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(); 或者使用

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

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();
或者使用

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
中):

如果我想使用
$var
作为
printvar
中的全局变量,而不是将其作为参数传递,并且我想
printvar
不关心
$var
来自哪个范围,那么在
使用strict
下有没有办法做到这一点

针对@mockinterface的回答: 使用
我们的
,我修改了第二个示例:

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

sub main {
  our $var = 5;
  {
    local $var = 10;
    printvar();
  }
  printvar();
}
我看到了输出

var is: 10
var is: 5

因此,
printvar
中的
our$var
似乎是这里的关键。

否,在您的场景中-使用strict,您只能使用
our
在全局范围内提升或显式检索变量

#!/usr/bin/perl -w

use strict;

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

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

&main();

我尝试使用您的示例,但没有得到错误@nrathaus是的,第一个版本是合法的Perl。问题是关于第二个版本。在第二个示例中,您在哪里定义了
$var
?为什么不使用全局变量,并在需要时分配给它?这种巫术只会让人头疼。@ZachLeighton是的,我想知道是否有可能避免在引用它的子例程上方向前声明全局。