同名サブルーチンの優先順
ローカルサブとrequireサブで、同名サブルーチンは、どちらが優先か? - 燈明日記
にて、
結論から言うとrequireサブが優先されます
追記:日記登録後、確認の為に見に行ったら修正されてました
自分の記憶と違っていたので、検証してみた。
結論から言うと、後から宣言したサブルーチンで上書きされます。
たとえば。
subpm.pmモジュール
package main; use strict; sub aaa { print "---useサブ---\n"; } 1;
sub.pl ライブラリ
package main; use strict; sub aaa { print "---requireサブ---\n"; } 1;
があったとする。
で、呼び出し実行側のスクリプトが
test.pl
#!/usr/bin/perl package main; use strict; use lib qw(./); use subpm; aaa(); sub aaa { print "---ローカルサブ---\n"; } aaa(); sub aaa { print "---ローカルサブ2---\n"; } require 'sub.pl'; aaa(); sub aaa { print "---ローカルサブ3---\n"; } aaa();
であった場合。
main aaa がそれぞれのファイルで重複しているが読込み順が
subpm.pm→test.pl→sub.pl となり
まず、subpm.pmの sub aaa{} が読み込まれ、次いでtest.plの sub aaa{}が読み込まれる。test.plで3種 sub aaa{} が呼び出されるが、後述のsub aaa{}が 優先される。
スクリプトの流れで、require ('sub.pl');の前に aaa()が呼び出されば、当然test.pl内のaaaサブルーチンが呼び出される。require ('sub.pl'); すれば、sub.plのaaaサブルーチンが優先される。
なんか、ごちゃごちゃ書いたけど出力結果見たほうが早いよね!
---ローカルサブ3--- ---ローカルサブ3--- ---requireサブ--- ---requireサブ---
"---useサブ---"
を出力したい場合は、subpm.pm内で aaa();するか
test.plのBEGIN{} 内でaaa();する。
#まぁ、モジュールを普通に使う人ははmainパッケージにしないと思うが…。
ちなみに、きちっと use warnings; しておけば
Subroutine aaa redefined の警告が出力される。