frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

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 -w

use 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

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";

}

…これを実行すれば &A::test(); の時以外は

勿論、main::test が実行されまくります。