如何在不使用eval的情况下动态地包含Perl模块?

前端之家收集整理的这篇文章主要介绍了如何在不使用eval的情况下动态地包含Perl模块?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我需要动态地包含一个Perl模块,但是如果可能的话,由于工作编码标准,我们希望远离eval。这工作:
  1. $module = "My::module";
  2. eval("use $module;");

但是如果可能的话,我需要一个没有eval的方法。所有google搜索都会导致eval方法,但是没有任何其他方式。

有没有eval可以做到这一点?

解决方法

在运行时使用 require加载模块。如果模块无法加载,通常会将其包装在块(而不是字符串)eval中。
  1. eval {
  2. require My::Module;
  3. My::Module->import();
  4. 1;
  5. } or do {
  6. my $error = $@;
  7. # Module load Failed. You could recover,try loading
  8. # an alternate module,die with $error...
  9. # whatever's appropriate
  10. };

eval {…}或做{…}语法和复制$ @的原因是因为$ @是一个可以由许多不同的东西设置的全局变量。你想尽可能地以原子方式获取这个值,以避免竞争条件其他的东西设置为不同的值。

如果您在运行时不知道该模块的名称,则必须手动在模块名称(My :: Module)和文件名(My / Module.pm)之间进行翻译:

  1. my $module = 'My::Module';
  2.  
  3. eval {
  4. (my $file = $module) =~ s|::|/|g;
  5. require $file . '.pm';
  6. $module->import();
  7. 1;
  8. } or do {
  9. my $error = $@;
  10. # ...
  11. };

猜你在找的Perl相关文章