1

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ましょうか?

4

3 に答える 3

5

local変数を宣言/作成しません—既存の変数の自動復元バックアップを作成するだけです—したがって、宣言する必要があります$lvar. localはパッケージ変数[1]でのみ機能するため、これは のour代わりに使用する必要がある稀なケースの 1 つです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";
}

または、2 つの潜水艦に対して 1 回だけ。

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 に答える