redefined。
2つのモジュールで、それぞれEXPORTした
同じ名前のメソッドを use して呼び出してみたら
どうなるだろう?…の実験結果メモ。
予想通りだけど、main のシンボルテーブルは
後から use した方のメソッドで上書きされてました。
・A.pm
package A;use base Exporter;
@EXPORT = qw(test);
sub test() {
print "A::test\n";
}
1;
・B.pm
package B;use base Exporter;
@EXPORT = qw(test);
sub test() {
print "B::test\n";
}
1;
・test.pl
#!/usr/bin/perl -wuse strict;
use A;
use B;
# 以下、main のシンボルテーブル から test を実行
test();
&test();
&main::test();
# 一応、それぞれ、パッケージ名から書いて実行してみる
# これは勿論、それぞれ変わりなく実行
&A::test();
&B::test();
# main のシンボルテープルから test を探して表示してみる
# 当たり前だけど、1回しか表示されないはず
foreach (keys %main::) {
print "main::$_\n" if /^test$/;
}
exit;
・実行結果
Subroutine main::test redefined at /usr/lib/perl5/5.8.5/Exporter.pm line 65.at ./test.pl line 5
B::test
B::test
B::test
A::test
B::test
main::test
案の定、redefined です…。
やっぱり、後から use した B::test で main::test は上書きされています。
ちなみに、test.pl 中に サブルーチン test() を最後に付け足して…
#!/usr/bin/perl -w…これを実行すれば &A::test(); の時以外はuse strict;
use A;
use B;
test();
&test();
&main::test();
&A::test();
&B::test();
foreach (keys %main::) {
print "main::$_\n" if /^test$/;
}
exit;
sub test() {
print "main::test\n";
}
勿論、main::test が実行されまくります。