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

@INCにコードリファレンスを入れる

perl

cpanminusのソースコードを見ているとそんなコードがあった。
どういう目的でこういうことになっているのかは全然わかっていない
ですが、@INCにコードリファレンスを入れるとそれが実行される
ようである。引数は第一引数が自分自身のコードリファレンス、
第二引数は useで指定したモジュール名みたい。モジュール名は
セパレータが"/"で拡張子もついている。


全くわけわからんが、まねして書いてみた。

#!/usr/bin/env perl
use strict;
use warnings;

BEGIN {
    my $sample =<< 'MODULE_END';
package MyApp::Sample;
use strict;

sub hello {
   my ($self, $who) = @_;
   print "Hello $who\n";
}
1;
MODULE_END

unshift @INC, sub {
    my ($code_ref, $pm_name) = @_;
    if ($pm_name eq "MyApp/Sample.pm") {
        open my $fh, "<", \$sample;
        return $fh;
    }
    return;
};

}

use MyApp::Sample;

MyApp::Sample->hello("Tom");


こうするとちゃんと "Hello Tom"と表示される。
どういう利点があるんだろう?きっと意味があることなんだろうけど、
今はよくわからないですね。cpanminusではfatpackedというハッシュに
コードを入れているので、その名前がヒントなのだろう。