我对Perl local
语法有问题。
代码如下:
#!/usr/bin/perl -w
&outer;
sub outer {
local $lvar = 'local';
&inner;
}
sub inner {
print "lvar: $lvarn";
}
如果我运行代码,它输出:
lvar: local
但是如果代码修改如下:
#!/usr/bin/perl -w
use strict;
&outer;
sub outer {
local $lvar = 'local';
&inner;
}
sub inner {
print "lvar: $lvarn";
}
然后出现错误:
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
吗?
local
几乎不是你想要的。使用my
,它声明了一个变量,该变量在整个封闭块中(其余部分)可见。
你到底想做什么还不清楚,但如果你需要在两个子程序之间共享一个变量,并保护它不被其他地方访问,那么你可以这样写。注意,这是一个闭包,并且$lvar
的值在调用两个子例程时都是持久的。
注意,不应该使用&subname
语法调用子例程。自从Perl 5于1994年推出以来,这种做法就一直是错误的。用subname()
代替。
use strict;
use warnings;
outer();
{
my $lvar;
sub outer {
$lvar = 'local';
inner();
}
sub inner {
print "lvar: $lvarn";
}
}
使用my
声明词法变量。重写一下怎么样?
#!/usr/bin/perl
use strict;
use warnings;
outer();
sub outer {
my $lvar = 'local';
inner($lvar);
}
sub inner {
my $lvar = shift;
print "lvar: $lvarn";
}
资源:
处理作用域(包括my
和local
的讨论)。
另一个很好的资源是《Modern Perl》一书。搜索lexical
local
不声明/创建变量—它只是创建一个现有变量的自动恢复备份—所以你仍然需要申报$lvar
。由于local
只适用于包变量[1],这是需要使用our
而不是my
的极少数情况之一。
outter();
sub outter {
local our $lvar = 'local';
inner();
}
sub inner {
our $lvar;
print "lvar: $lvarn";
}
你也可以将变量声明为"全局"
our $lvar;
outter();
sub outter {
local $lvar = 'local';
inner();
}
sub inner {
print "lvar: $lvarn";
}
或者两个潜艇只一次。
outter();
{
our $lvar;
sub outter {
local $lvar = 'local';
inner();
}
sub inner {
print "lvar: $lvarn";
}
}
但实际上,local
是你应该只在被迫使用包变量时才使用的东西。当您创建自己的变量时,您需要使用my
。
outter();
{
my $lvar;
sub outter {
$lvar = 'local';
inner();
}
sub inner {
print "lvar: $lvarn";
}
}
- 它还可以处理词法变量和包变量的hash元素和数组元素。