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

时间:2010-03-29 20:40:32

标签: perl

正如标题所说,我不清楚何时会调用这样的子程序。在requireperldoc页面上可以写下:

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

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

2 个答案:

答案 0 :(得分:12)

Perl在遍历@INC寻找模块时调用@INC中的子例程引用。也就是说,当您尝试使用userequire加载模块时,您会触发它,并且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中的子程序。