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是的,我想知道是否有可能避免在引用它的子例程上方向前声明全局。