1

我对 Perllocal语法有疑问。

代码如下:

#!/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吗?

4

3 回答 3

8

local几乎从来都不是你想要的。Use 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";
  }
}
于 2013-06-03T15:35:20.797 回答
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";
}

资源:

处理范围界定(包括对myvs的讨论local)。

另一个很好的资源是Modern Perl一书。只需搜索“词汇”。

于 2013-06-03T15:08:09.640 回答
5

local不声明/创建变量——它只是创建一个现有变量的自动恢复备份——所以你仍然需要声明$lvar. 由于local仅适用于包变量[1],因此这是需要使用our而不是my.

outter();
sub outter {
    local our $lvar = 'local';
    inner();
}
sub inner {
    our $lvar;
    print "lvar: $lvar\n";
}

您还可以“全局”声明变量。

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

  1. 它也适用于词法和包变量的散列元素和数组元素。
于 2013-06-03T16:06:59.857 回答