私のプログラムが無限ループになるという問題がありました。問題を絞り込んだところ、キーワードが必要であることがわかりましたがそれを引き起こしていました。したがって、私は問題を理解するために、より大きなプログラムとしての構造を含む正確なファイルを持つ簡単なhello worldプログラムを作成しました。それはtest.plからhelloWorldを呼び出すメインファイルtest2.pmを持っています。 test2.pmはtest1.pmから同じルーチンを呼び出します。Perlキーワードrequireが奇妙な結果を出す
Test.pl
#!/usr/bin/perl
use test1;
use test2;
print "In test\n";
test2::helloWorld();
Test1.pm
#!/usr/bin/perl
package test1;
use test2;
require "test.pl";
@ISA = qw (Exporter);
@Export = qw(
helloWorld
);
sub helloWorld {
print "Hello world: Test1\n";
}
Test2.pm:
#!/usr/bin/perl
package test2;
use test1;
@ISA = qw (Exporter);
@Export = qw(
helloWorld
);
sub helloWorld {
test1::helloWorld();
}
これはプログラムからの出力である:
In test
Hello world: Test1
In test
Hello world: Test1
出力を2回印刷した理由を知りたいですか?私が #require "test.pl"をtest1.pmからコメントアウトすると、出力は1回だけ出力されます。
Test1.pm
#!/usr/bin/perl
package test1;
use test2;
#require "test.pl";
@ISA = qw (Exporter);
@Export = qw(
helloWorld
);
sub helloWorld {
print "Hello world: Test1\n";
}
を(行コメントアウト必要)そして、これは今出力されます。
In test
Hello world: Test1
私はこのことを理解していれば、私は私の本当の問題に取り組むことができると思います。これに関する助けをありがとう:)
私よりはるかに良い説明です。 – Schwern
説明をいただきありがとうございます...それは多くの助けとなりました。私はちょっとだけ質問したかった。 2.2で述べたように、 'in test 'を出力し、' test2 :: helloWorld'を呼び出します。しかし、なぜそれが印刷し、最初の場所で関数を呼び出すのですか?キーワード 'require'は、ファイルを実行しないようにINLCLUDEするために使われますか?これは間違っていますか? – Richeek
'require'は*と* runsをコンパイルします(' use'も同様です)。 'require'はファイルを読み込み、内容を' eval'するだけではなく、一回だけです。さもなければ '@ISA = qw(Exporter);のようなものは起こりません。あなたのコメントのために – Schwern