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

doとrequireの違いがわからなくなったので調べてみた

perl

まずはperldocを読むべし。

do EXPR

Uses the value of EXPR as a filename and executes the contents of the file as a Perl script

require EXPR

demands some semantics specified by EXPR

これだけだとよくわかんないので、

warn 'loaded';
{ foo => 1};

という単純な設定ファイルをdo/requireしてみる。

do
do 'config.pl';
do 'config.pl';

print $INC{'config.pl'};

# loaded at config.pl line 1.
# loaded at config.pl line 1.
# config.pl
require
require 'config.pl';
require 'config.pl';

print $INC{'config.pl'};

# loaded at config.pl line 1.
# config.pl

requireは1回のみロード、doは何回もロードされる。%INCにPATHが設定されるのは同じ。


じゃあ、doは@INCから検索されるのか?

do 'Test/More.pm';
warn $INC{'Test/More.pm'};

# /Users/kotaro/perl5/perlbrew/perls/perl-5.15.4/lib/5.15.4/Test/More.pm

されますねー。

ちなみにdoはrequireみたいにbarewordでのモジュールロードはできないぽい。

まとめ

doとrequireは"once"かどうかが違う。