いくつかの問題があります。
qw()
構文にはコンマを使用しないでください。はqw
、空白で区切られた各フレーズを受け取り、それを配列要素に配置します。
これら2つは同じです:
my @bar = qw(foo bar barfu); #No commas!
my @bar = ("foo", "bar", "barfu"); #Commas Required
- 変数をエクスポートする場合は、その前に印章を置く必要があります。
あなたが持っている:
our @EXPORT_OK = qw(DEBUGVAR);
そのはず:
our @EXPORT_OK = qw($DEBUGVAR);
- 新しいエクスポーター構文を使用する必要があります。
新しいエクスポーター構文は次のとおりです。
package global_config;
use strict;
use warnings;
use Exporter 'import'; #Not "require". No need for "@ISA"
our @EXPORT_OK = qw(DEBUGVAR);
our $DEBUGVAR = "Hello, World";
1; #Makes no real difference, but you shouldn't say "return 1". Just standard.
- 最後に、変数のエクスポートを行っていますか?それは悪い習慣です。
- 関数でさえ、何かをエクスポートすることが今や疑問視されています。ユーザーの名前空間を汚染します。(少なくとも、を使用しています
@EXPORT_OKAY
)。File::Specを見てください。デフォルトでは、サブルーチンに完全修飾パッケージ名を使用します。
- 問題の変数は完全なパッケージ名を介してアクセスできる
$global_config::DEBUGVAR
ため、実際にエクスポートする必要はありません。
- みんながやったら?はい、あなたは幼稚園でこの言い訳を最後に聞いたことがありますが、それはここに当てはまります。複数のモジュールがエクスポートされた場合を想像してみてください
$DEBUGVAR
。
難問を回避する方法はいくつかありますが、オブジェクト指向のPerlを使用してこの変数を設定し、ユーザーが変数を変更できるようにするのが最善です。
package MyPackage;
use strict;
use warnings;
use feature qw(say);
sub new {
my $class = shift;
my $debug = shift; #Optional Debug Value
my $self = {};
bless $self, $class;
if (not defined $debug) {
$debug = "Hello, world!";
$self->Debug($debug);
return $self;
}
sub Debug {
my $self = shift;
my $debug = shift;
if (defined $debug) {
$self->{DEBUG} = $debug;
}
return $debug;
}
1;
このモジュールを使用するには、新しいオブジェクトを作成するだけで、デバッグが設定されます。
use strict;
use warnings;
use MyPackage #No exporting needed
#Create an object w/ Debug value;
my $obj = MyPackage->new; #Debug is the default.
say $obj->Debug; #Prints "Hello, world!"
# Change the value of Debug
$obj->Debug("Foo!");
say $obj->Debug; #Now prints "Foo!"
#Create a new object with a different default debug
$obj2 = MyPackage->new("Bar!");
say $obj2->Debug; #Print "Bar!";
これにより、いくつかの問題が解決されます。
- 各オブジェクトが独自の値を持つようになったため、デバッグの複数の値が可能になります
- 名前空間の汚染やパッケージ変数へのアクセスについて心配する必要はありません。繰り返しますが、必要なものはすべてオブジェクト自体に含まれています。
- 複雑さはオブジェクト自体の内部に隠されているため、問題のデバッグは簡単です。
- これは新しい推奨メソッドであるため、構文に慣れて、オブジェクト指向のPerlコードを読み取れるようにすることもできます。あなたはそれをますます見るでしょう。