RoadMovie

write down memos or something I found about tech things

@INCの中身 & Perlでリファレンスをメソッドに渡す理由

「Can't locate ~~.pm in @INC」とかでcpanmでモジュール入れるとかいろいろあると思うのですが、その際に@INCの中身ってどうなってるんだろうと思ってました。

 

アプリのルートディレクトリで

$ perl -Ilib -e "use Data::Dumper; print Dumper \@INC"
    
    $VAR1 = [
          'lib',
          '/home/homepage/.plenv/versions/5.16.3/lib/perl5/site_perl/5.16.3/i686-linux',
          '/home/homepage/.plenv/versions/5.16.3/lib/perl5/site_perl/5.16.3',
          '/home/homepage/.plenv/versions/5.16.3/lib/perl5/5.16.3/i686-linux',
          '/home/homepage/.plenv/versions/5.16.3/lib/perl5/5.16.3',
          '.'
        ];

見れました。ちなみにIlibでlibディレクトリのパスを通しているという感じです。ためしに-Ilibを抜いて実行してみるとlibがなくなっていることがわかります。

Rubyやってるときはirbとかrails consoleとかでいろいろ確認できたのですが、perlperl -eを使えばいろいろできそう。

 

ちなみにperlのリファレンスもコピーせずにその値を参照しに行くということはわかっていなかったのですが、いざコード内で使うと把握しづらい(データ構造も含めて)と思っていたのですが、少し明かりが。

 

例えばメソッドに対して配列を引数として渡したいとき

sub example {
  my ($a, $b) = @_;
}

my @array = ('hoge', 'fuga');
example('1', @array);

とやってしまうとhogeしか渡らなくてfugaは無視されます。さらにDBから取ってきたものをこの形で渡すと何個引数があってもたりない・・・。

なので

my @array = ('hoge', 'fuga');
example('1', \@array);

と、リファレンスで渡してやることで

sub example {
  my ($a, $b) = @_;
  print $b->[0];
}

とかでできるわけですね!

普段なんとなくここはリファレンスでいけたみたいな形でガンガン開発を進めていたのですが、ちゃんと理由が把握出来ました。勉強になりました。。