我的Perl local
语法有问题。
代码如下:
#!/usr/bin/perl -w
&outer;
sub outer {
local $lvar = 'local';
&inner;
}
sub inner {
print "lvar: $lvar\n";
}
如果我运行代码,则输出:
lvar: local
但如果代码修改如下:
#!/usr/bin/perl -w
use strict;
&outer;
sub outer {
local $lvar = 'local';
&inner;
}
sub inner {
print "lvar: $lvar\n";
}
然后,出现错误:
Global symbol "$lvar" requires explicit package name at ./test.pl line 7.
Global symbol "$lvar" requires explicit package name at ./test.pl line 12.
Execution of ./test.pl aborted due to compilation errors.
我在这里很困惑。我想最小化$lvar
的范围,我也想使用strict
指令。但似乎它们无法共存。
use strict;
和local
可以共存吗?或者,我应该说明our $lvar
?
答案 0 :(得分:8)
local
几乎不是你想要的。使用my
,它声明一个在封闭块的整个(其余部分)可见的变量。
目前还不清楚你想要做什么,但如果你需要在两个子程序之间共享变量并保护它不被其他地方访问,那么你可以写这样的东西。请注意,这是一个闭包,$lvar
的值在调用任一子例程时都是持久的。
请注意,不应使用&subname
语法调用子例程。自从Perl 5于1994年推出以来,这是错误的。请改用subname()
。
use strict;
use warnings;
outer();
{
my $lvar;
sub outer {
$lvar = 'local';
inner();
}
sub inner {
print "lvar: $lvar\n";
}
}
答案 1 :(得分:7)
使用my
声明词法变量。这个改写怎么样?
#!/usr/bin/perl
use strict;
use warnings;
outer();
sub outer {
my $lvar = 'local';
inner($lvar);
}
sub inner {
my $lvar = shift;
print "lvar: $lvar\n";
}
资源:
Coping with Scoping(包括对my
与local
的讨论。)
另一个好的资源是书Modern Perl。只需搜索“词汇”。
答案 2 :(得分:5)
local
不会声明/创建变量 - 它只是创建现有变量的自动恢复备份 - 因此您仍需要声明$lvar
。由于local
仅适用于包变量 [1] ,因此这是极少需要使用our
而不是my
的情况之一。
outter();
sub outter {
local our $lvar = 'local';
inner();
}
sub inner {
our $lvar;
print "lvar: $lvar\n";
}
您也可以声明变量“global”。
our $lvar;
outter();
sub outter {
local $lvar = 'local';
inner();
}
sub inner {
print "lvar: $lvar\n";
}
或两次潜艇一次。
outter();
{
our $lvar;
sub outter {
local $lvar = 'local';
inner();
}
sub inner {
print "lvar: $lvar\n";
}
}
但实际上,local
是您在强制使用包变量时应该只想使用的东西。在创建自己的变量时,您希望改为使用my
。
outter();
{
my $lvar;
sub outter {
$lvar = 'local';
inner();
}
sub inner {
print "lvar: $lvar\n";
}
}