向perl应用程序添加动态代码的最佳方法

时间:2017-10-25 11:33:51

标签: perl

我知道此问题的具体实例之前已经得到解答:

Perl Monks也有很好的答案:

但我想要一个强大的方法来将函数添加到Perl应用程序中:

  1. 高效:如果不需要代码,则不应编译。
  2. 易于调试:错误报告如果动态代码出现问题,应该指向动态代码的正确位置。
  3. 易于扩展:添加新代码应该像添加新文件或目录+文件一样简单。
  4. 易于调用:主应用程序应该能够使用"添加"没有太多麻烦。一种有效的机制来检查"是否加上"已加载,如果没有加载,将是一个加号。
  5. 为了说明这一点,以下是一些可以从一个好的解决方案中受益的例子:

    • 一组用于从不同应用程序移动数据的脚本。例如,将数据从OpenCart移动到Prestashop,其中数据模型中的每个实体都具有特定的"添加"处理输入或输出;然后中间数据模型负责数据的转换。这可用于向任何方向移动数据,甚至可以在同一电子商务的不同版本之间移动数据。

    • 需要在不同位置呈现不同类型HTML的Web应用程序。每个"模块"知道如何处理某些信息并接受参数来完成它。模块输出HTML,另一个输出文档列表,另一个输出文档,另一个输出横幅等。

    以下是我使用过的一些例子。

    在运行时加载函数并输出可能的编译错误:

    eval `cat $file_with_function`;
    if( $@ ) {
      print STDERR $@, "\n";
      die "Errors at file $file_with_function\n";
    }
    

    使用File::Slurp更加健壮:

    eval read_file("$file_with_function", binmode => ':utf8');
    

    检查是否已定义某个功能:

    if( !defined &myfunction ) {
      die "myfunction is not defined\n";
    }
    

    可以从那里调用该函数。这对一个函数来说很好,但对很多函数来说都不行。

    如果该功能放在模块中:

    require $file_with_function; # needs the ".pm" extension, i.e. addon/func.pm
    $name_of_module->import();   # need to know the module name, i.e. Addon::Func
    
    $name_of_module->myfunction(...);
    

    可以在require内保护eval,然后像以前一样使用$@

    使用Module::Load

    load $name_of_module;
    

    跟随import并以相同的方式使用。 安全性不应该是一个问题,因为可以假设动态代码来自受信任的地方。还有更好的方法吗?哪种方式被视为良好做法

    如果有帮助,我将在Dancer框架内使用解决方案(在其他地方,但不是唯一的地方)。

    编辑:鉴于评论,我添加了更多信息。我想到的所有案例都有共同之处:

    1. 有一个以上的动态代码。可能很多人开始。
    2. 每个代码都有相同的接口

0 个答案:

没有答案