読者です 読者をやめる 読者になる 読者になる

NeverBlog::Likk::Unexistable;

見なかったことにして下さい

同名サブルーチンの優先順

ローカルサブと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 の警告が出力される。