如何在编译时从外部文件导入Perl代码?

时间:2010-02-17 16:21:09

标签: perl perl-module

帮助Perlers!有没有人知道一个简单的“插入代码在这里”的方法会在编译时将外部文件中的代码带入一个包?

背景:

我有一个标准的PBP风格的由内而外的课程变得非常大。我想将代码分成多个文件但不扩展类。最好的是,我只需在编译时将代码插入到示例模块的“Magic JuJu”部分(见下文)。

我已经将AutoLoader看作是实现这一目标的一种方法。但是,有两件事让我停下来。如果我可以绕过这些,它可能是一个接近最优的解决方案:

  1. 我不想将每个小子分成单独的文件;只是几个合理大小的文件(尽管在调用者中使用子存根很好);以及

  2. 我不想推迟每个子程序的编译;我希望在初次使用时编译一些子。但是,这可能不是一个交易破坏者。

  3. 我知道Moose提供了“角色”,我相信这样做很好,但出于各种原因,Moose不是这个项目的选择,鼠标也不是。

    我在“Magic JuJu”位置使用了“require q(some / file)”,但是没有维护持久变量范围,即来自外部文件的subs不能正确“看到”对象属性哈希(换句话说,将require放在文件的顶部会产生相同的效果)。我总是可以通过使用setter和getter来解决这个问题。所以这不是一个交易破坏者,但需要一些编码时间和执行开销,而我不会发生。

    最后,我不想扩展课程;它已经有多重继承。我只想要一个简单的“插入代码在这里”的方法在编译时将代码放入一次。

    总结:

    1. (必需)将代码从外部文件导入包命名空间
    2. (必需)仅在编译时或最小运行时开销
    3. (必填)不扩展类
    4. (所需)荣誉插入位置范围
    5. 下面带有“Magic JuJu”评论的示例代码:

      package T;
      
      use strict;
      use warnings;
      
      ########## BEGIN object persistent variables scope block ############
      {
        my %Attr_Name_Env;
      
        ## Constructor 'new'
        #
        sub new {
          ## Get and confirm arguments
          #
          my $class      = shift;
          my $href_arg = {@_};
          my $name_env = $href_arg->{'name_env'};
      
          ## Bless anon scalar into class
          #
          my $obj_new   = bless anon_scalar(), $class;
          my $idx_self  = ident $obj_new;
      
          # Populate object attributes
          #
          $Attr_Name_Env{ $idx_self } = $name_env;
      
          return $obj_new;
        }
        ## END Constructor 'new'
      
        sub DESTROY {... as you do ...}
      
        sub t_get_name_env {
          my $self      = shift;
          my $idx_self  = ident $self;
          return $Attr_Name_Env{ $idx_self };
        }
      
        ## insert magic juju here
      
      }
      ########## END object persistent variables scope block ############
      
      1;
      

      可能是一个带有啜食和评估的BEGIN区块......

2 个答案:

答案 0 :(得分:2)

您可以使用模块并导入所需的潜艇。

use MyMod qw( wanted_sub_1 wanted_sub2 );

要访问属性哈希,您需要修改目标模块的import

package MyClass;
use MyMod { attrib1 => \%attrib1, attrib2 => \%attrib2 }, qw( wanted_sub1 wanted_sub2 );
然后

MyMod的{​​{1}}将创建在初始哈希参数上关闭的代码引用,并将它们安装到import命名空间中。

答案 1 :(得分:1)

如果您愿意承担后果,可以Filter::Macro