何时在@INC中调用子程序引用?

gvk*_*vkv 9 perl

正如标题所说,我不清楚何时会调用这样的子程序.从perldocrequire页面可以写出:

push @INC, \&my_sub;
sub my_sub {
   my ($coderef, $filename) = @_; # $coderef is \&my_sub
   ...
}
Run Code Online (Sandbox Code Playgroud)

但这究竟在哪里?必需的包或要求的脚本(或包)?我已经尝试了一些哨兵print陈述,但两种方法都没有这么清楚,有些东西我没有得到.

bri*_*foy 12

Perl在@INC遍历@INC查找模块时调用子例程引用.也就是说,当您尝试使用use或加载模块时,您将触发它,require并且Perl在前面的@INC位置找不到该模块.

BEGIN {
    push @INC, 
      sub { print "Oops: There was an error looking for $_[1]\n"; };
    }

eval "use Cat::Burglar";
eval "use Local::NotThere";
require Cat::Burglar;
Run Code Online (Sandbox Code Playgroud)

@INC尝试加载模块之前,需要确保子例程引用已经存在.请记住,这use是一个编译时功能,这require是一个运行时功能.与添加其他"常规" @INC条目一样,您可能希望BEGIN在程序中尽早在块中执行此操作.