Perl语法用法,使用严格和局部



我对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";
}

资源:

处理作用域(包括mylocal的讨论)。

另一个很好的资源是《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";
   }
}

  1. 它还可以处理词法变量和包变量的hash元素和数组元素。

最新更新