1

解決済み:結局のところ、私の問題は、@EXPORT_OK割り当てのDEBUGVARの前に$を付けていなかったという事実と「useconfig_globalqw(configDEBUGVAR);」に根ざしていました。ライン。エラーが発生しないため、これが問題であることがわかりませんでした。したがって、修正は、これらのポイントで変数の前に適切な構文を配置することです。

だから私はperlモジュールの作成とインポートのコツをつかもうとしています。なぜこれが難しくなったのかはわかりませんが、この一見些細な作業で大きな問題を抱えています。これが私のモジュールの内容です:

package global_config;
use strict;

require Exporter;
our @ISA = qw(Exporter);
our @EXPORT_OK = qw(DEBUGVAR);

our ($DEBUGVAR);

our $DEBUGVAR = "Hello, World!";

return 1;

モジュールをインポートするperlスクリプトの内容は次のとおりです。

use strict;

use config_global qw(config, DEBUGVAR);
our %config;
our $DEBUGVAR;


print "variable imported with value: ".$DEBUGVAR;

出力は「value:でインポートされた変数」であり、他には何もありません。私の変数はその値を失っているようです。私は何が間違っているのですか?

編集:少しいじって警告をオンにした後、$DEBUGVARが実際にインポートされないという問題を切り分けました。$ config_global:DEBUGVARを介して使用すると、期待どおりに機能します。現在の問題は、名前空間にインポートされていないことです。何が得られますか?

4

4 に答える 4

1

いくつかの問題があります。

  • 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コードを読み取れるようにすることもできます。あなたはそれをますます見るでしょう。
于 2011-12-28T19:38:57.437 に答える
1

パッケージから変数をエクスポートすることは必ずしも推奨される方法ではありませんが、エクスポートする変数の実際の名前を使用する必要があります。この場合、それはサブルーチンの名前であり、そうでは$DEBUGVARありません。DEBUGVAR

config モジュールを使用するスクリプトでは、インポートされた変数は厳密な変数から除外されるため、$DEBUGVAR変数を として宣言する必要はありません。our

于 2011-12-28T16:45:28.673 に答える
0

ここにコンマが必要ですか:

use config_global qw(config, DEBUGVAR);

また、構成をエクスポートしていないため、次のようにうまく機能する可能性があります。

use config_global qw(DEBUGVAR);

our $DEBUGVAR;undef に設定される可能性があるため (または、少なくとも「use」行の前に置く) 、最後も削除しますが、これについてはわかりません。

于 2011-12-28T16:31:00.593 に答える
0

名前が混同されています。次のようになります。

use config_global ...

package global_config;

それは警告を発すると思うかもしれませんが。警告を使用していない限り...?

到着予定時刻:

our @EXPORT_OK = qw($DEBUGVAR);
                    ^  

また、その変数には 2 つの宣言があります。デバッグするときは本当に警告を使用する必要があります。そうしないと、どこにもたどり着きません。

于 2011-12-28T16:31:29.433 に答える