Perl语法用法,使用strict和local

时间:2013-06-03 15:04:09

标签: perl

我的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

3 个答案:

答案 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(包括对mylocal的讨论。)

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

  1. 它也适用于词法和包变量的哈希元素和数组元素。