1

そのクラスに対してグローバルであり、そのクラスのすべてのサブルーチンで使用できる変数を作成できないようです。

どうやらうまくいく例がいたるところに見られますが、私がすることは何もできません。

コード:

my $test = new Player(8470598);

package Player;

use strict;
use warnings;
use Const::Fast;


$Player::URL = 'asdfasdasURL';
my $test3 = '33333333';
our $test4 = '44444444444';
const $Player::test0 => 'asdfasdas000';
const my $test1 => 'asdfasdas111';
const our $test2 => 'asdfasdas222';

sub new{
    print $Player::URL;
    print $Player::test0;
    print $test1;
    print $test2;
    print $test3;
    print $test4;
    return(bless({}, shift));
}

出力:

Use of uninitialized value $Player::URL in print at D:\Text\Programming\Hockey\test.pl line 19.
Use of uninitialized value $Player::test0 in print at D:\Text\Programming\Hockey\test.pl line 20.
Use of uninitialized value $test1 in print at D:\Text\Programming\Hockey\test.pl line 21.
Use of uninitialized value $Player::test2 in print at D:\Text\Programming\Hockey\test.pl line 22.
Use of uninitialized value $test3 in print at D:\Text\Programming\Hockey\test.pl line 23.
Use of uninitialized value $Player::test4 in print at D:\Text\Programming\Hockey\test.pl line 24.

ここで何が起こっているのですか?

4

2 に答える 2

5

コード全体は実行前にコンパイルされますが、実行可能部分は順番に実行されます。特に、new()呼び出しは、パッケージPlayerの割り当てまたはconst呼び出しの前に発生します。

すべてのPlayerコードをPlayer.pmファイルに移動して呼び出すと、新しいコードのuse Player;前にすぐにコンパイルおよび実行され、期待どおりに機能します。

于 2013-02-17T16:58:47.907 に答える
0

パッケージレベルのコード

my $test = new Player(8470598);

パッケージレベルのコードの前に実行されています

$Player::URL = 'asdfasdasURL';
my $test3 = '33333333';
our $test4 = '44444444444';
const $Player::test0 => 'asdfasdas000';
const my $test1 => 'asdfasdas111';
const our $test2 => 'asdfasdas222';

ファイルの前にあるからです。

パッケージをインライン化する場合は、変更します

use Player;

BEGIN {
    package Player;

    ...

    $INC{"Player.pm"} = 1;
}

use Player;
my $test = Player->new(8470598);

あなたは時々角を切ることができます。この場合、両方をカットできます。

  • BEGIN必要ありません。
  • $INC{"Player.pm"} = 1;ドロップすることでドロップできますuse Player;
于 2013-02-17T21:35:53.767 に答える