現在、モジュールのリロードを試しています。私が達成しようとしている目的は、モジュールファイルの定義されたサブルーチンで何かを変更し、新しい定義を使用してモジュールをリロードすることです。モジュールのリロードとPerlでのサブルーチンの再定義
現在、test
サブルーチンのprint文を変更して、サブルーチンが元のコードを実行するのを待ってから、モジュールがリロードされる前に "これはいくつかの異なるテキストです"と表示します。
Subroutine test redefined at /Test/testmodule.pm line 9.
これは私が欲しいものを正確にですが、次のように出力されている:
しかし、私は、現在取得しています、メッセージです。
this is some text Subroutine test redefined at /Test/testmodule.pm line 9. this is some text
私は何を望んでいることは、それはではなく、新しい定義を参照します、次回はそれがテストサブルーチンを実行することをされたモジュールがリロードされたときにということであり、それは、サブルーチンが再定義されていることを実現します古いもの。
モジュールをリロードする際に以前の質問を検索しましたが、回答のループ(パッケージAはBを使用し、BはAが使用されます)やパッケージ内の名前空間の衝突がありましたが、ここに。 I サブルーチンが再定義され、新しい定義が使用されます。
ソースコード: main.pl
#!/usr/bin/perl
use strict;
use warnings;
use Module::Reload::Selective;
use Test::testmodule;
while(1) {
test(); #run module's define subroutine
sleep(5); #stop terminal from being flooded too quickly
#Ensure that the module is reloaded
$Module::Reload::Selective::Options->{SearchProgramDir} = 1;
$Module::Reload::Selective::Options->{ReloadOnlyIfEnvVarsSet} = 0;
Module::Reload::Selective->reload(qw(Test::testmodule)); #reload!
}
ソースコード:(main.plから./Test/
相対)testmodule.pm
#!/usr/bin/perl
use strict;
use warnings;
# allow exportation
require Exporter;
our @ISA = qw(Exporter);
our @EXPORT = qw(test);
sub test {
print("this is some text\n"); # this line is edited in the source file to
# 'print("this is some different text\n");'
}
1;
任意のポインタまたは参照チュートリアルには華麗です。実際、答えが信じられないほど単純ではない場合、答えを直接私に伝えないと、私はあなたの提案された資料を読んで全体的により良い理解を得ることができます。
必要なすべてのCPANモジュールがインストールされており、変更後にtestmodule.pmが正常に書き込まれていることを確認できます。
OS:科学のLinux CERN 6、カーネルバージョン2.6.32-131.4.1.el6.x86_64
用に構築
のPerl:v5.10.1(*)はx86_64-linuxのスレッドのマルチ
多くのありがとうございました。
オーウェン
どのような新しい定義ですか?あなたは同じ出力を得る同じサブをリロードしています。 – TLP
ありがとうございます。 2番目の段落では、_testmodule.pm_でソースコードの行を変更することに言及します。投稿を編集してより明示的にする必要があります。これを私の注意を引くことに感謝します。 – OwenD