0

これはusex.plです:

#use strict;
require 'x.pl';
print $x;

これがx.plです:

#use strict;
our $x = 99;
1;

図のように正常に動作します。usex.plでstrictを使用するように行のコメントを外すと、次のようになります。

Global symbol "$x" requires explicit package name

x.plでのstrictの使用の有無は重要ではないようです(「our」キーワードを削除しない限り、ただし、それには興味がありません)。

私はPerlにかなり慣れていません。strictによって$xがメインスクリプトに表示されないのはなぜですか?これに対する通常の解決策は何ですか?

4

2 に答える 2

7

2つの理由。

  1. エラーは、コンパイル時にrequire実行される前に発生します。を使用して簡単に修正できますBEGIN

  2. ourは字句スコープであり、 とは異なる字句スコープ (ファイルまたはブロック) にあるprintため、もはや有効ではありません。

全体のアプローチは根本的に悪いです。より良い方法は次のとおりです。

package MyConfig;
use strict;
use warnings;
use Exporter qw( import );
our @EXPORT = qw( $x );
our $x = 123;
1;

use strict;
use warnings;
use MyConfig;
print "$x\n";
于 2012-04-12T18:17:09.490 に答える
5

Hehe、ourグローバルスコープとレキシカルスコープの概念が混在しているため、理解するのは簡単ではありません。それが行うことは、グローバル変数をstrict 'vars'プラグマから除外し、そのスコープ内で非修飾アクセスを許可することです。これは、囲んでいるブロックまたは現在のファイルの最後です。マニュアルの完全な (ただし簡単な) ストーリーを読んでくださいperldoc -f our。コマンド ラインからアクセスすることもできます。

スクリプトに関しては、パッケージ修飾名を使用するように変数アクセサーを変更することで、マニュアルの言葉が真実であることを確認できます。

use strict;
require 'x.pl';
print $main::x;
于 2012-04-12T18:01:05.643 に答える