私はPerlを初めて使うので、Perl BEGINはコンパイルに失敗しました。私は次のようにそのコードを見つける実行することはできません。スカラー@リスト
#! perl -T
use strict;
use warnings;
BEGIN {
my @classes = qw(Animal Cow Sheep Horse Mouse);
use Test::More tests => scalar @classes;
}
を私は5
にscalar @classes
を変更すると、それはokです。 use Test::More tests => scalar @classes;
をprint scalar @classes;
に変更しても問題ありません。しかし、一緒にいるときは間違っています。どうして?
BEGINブロックの残りの部分が*前に*使用されているのは、BEGINブロックの内容が*完全に*コンパイルされた後に実行されるからです。順序は: 'my @classes = ...'をコンパイルし、 'Test :: :: More'をコンパイルし、' use Test :: More'を実行します( 'use Test :: More'が完全にコンパイルされているので)、' my @classes = ... ' 'perl -MO = Concise、BEGIN -e '...' ' – ThisSuitIsBlackNot
@ThisSuitIsBlackそうではありません。「BEGINブロックは独自のコンパイル段階を持っています」と最終コードブロックです。また、 'my'にはコンパイル時と実行時の両方の効果があります。コンパイル時の効果は、「@class'が明示的なパッケージ名を必要とするグローバルシンボル」エラーを出さない理由ですが、実行時まで代入は行われません。 – cjm