确定程序启动时加载的模块

我有一个分叉服务器。 我在fork之前加载所有模块。

...还是我? 我想在我的程序中的某个点之后为每个加载的模块记录一条消息给STDERR。

我打算使用以下内容,但它记录了使用do执行的一些脚本。

my %ignore = map { $_ => 1 } ( ... );
unshift @INC, sub {
   my (undef, $path) = @_;
   warn("$path wasn't loaded before forking.n")
      if !$ignore{$path};

   return ();
};

我不是没有想法,但在我花更多时间在这之前,我想知道是否有现有的解决方案。


什么东西都用do ? 简单

if $path =~ /.pmz/ && !$ignore{$path};

足以区分?

其他选项:

使用PPI进行静态代码分析(使用或基于Module :: Extract :: Use)。

在SIGHUP或某些其他信号时将%INC转储到文件。


解:

my $old_require =
   defined(&CORE::GLOBAL::require)
      ? &CORE::GLOBAL::require
      : sub { CORE::require($_[0]) };

my $new_require = sub {
   my $path = shift;
   if ($INC{$path}) {
      return $old_require->($path);
   }

   my $rv = $old_require->($path);
   warn("Loaded $path after forkn");
   return $rv;
};

no warnings 'redefine';
*CORE::GLOBAL::require = $new_require;

该解决方案具有以下特点:

  • 通过require EXPR加载日志模块。
  • 记录require BAREWORD加载的模块。
  • 记录use BAREWORD加载的模块。
  • 忽略由do EXPR加载的代码。
  • 忽略无法加载的模块。
  • 忽略已经加载的模块。
  • 即使@INC被操纵,也可以工作。
  • 最后四个是OP中解决方案遇到的问题。 我找不到这个解决方案的任何缺点。

    链接地址: http://www.djcxy.com/p/78877.html

    上一篇: Determining modules loaded once program starts

    下一篇: Scalac gives error found: scala.Boolean(false) required: java.lang.Boolean