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というハッシュに
コードを入れているので、その名前がヒントなのだろう。