正如标题所说,我不清楚何时会调用这样的子程序。在require的perldoc页面上可以写下:
push @INC, \&my_sub;
sub my_sub {
my ($coderef, $filename) = @_; # $coderef is \&my_sub
...
}
但这究竟在哪里?必需的包或要求的脚本(或包)?我已经尝试了一些哨兵print
陈述,但两种方法都没有这么清楚,我有一些东西没有得到。
答案 0 :(得分: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;
在尝试加载模块之前,需要确保子例程引用位于@INC
。请记住,use
是编译时功能,require
是运行时功能。与添加其他“常规”@INC
条目一样,您可能希望在程序中尽早在BEGIN
块中执行此操作。
答案 1 :(得分:1)
为了避免将我们的子程序与标准Perl模块中的子程序混淆,最好使用unshift
而不是push
。因此,它将首先使用@INC
中的子程序。