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

标签 perl perl-module

帮助佩勒斯!有谁知道简单的“在此处插入代码”方法可以在编译时将外部文件中的代码引入包中?

背景:

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

我将 AutoLoader 视为实现这一目标的一种手段。然而,有两件事让我犹豫不决。如果我能解决这些问题,这可能是一个近乎最佳的解决方案:

  1. 我不想将每个小子拆分成一个单独的文件;只是一些大小更合理的文件(不过,在调用者中使用子 stub 就可以了);和

  2. 我不想推迟每个子程序的编译;我想在初次使用时编译一些潜艇。然而,这可能不会破坏交易。

我知道 Moose 提供了“角色”,我相信它做得很好,但由于各种原因,Moose 不是这个项目的选择,Mouse 也不是。

我在“Magic JuJu”位置使用了“require q(some/file)”,但这并不能维持持久变量范围,即来自外部文件的子程序不能正确“看到”对象属性哈希值(换句话说,将 require 放在文件顶部将具有相同的效果)。我可以通过始终使用 setter 和 getter 来解决这个问题。因此,这并不是一个大问题,但需要一些我不想承担的编码时间和执行开销。

最后,我不想延长类(class);它已经具有多重继承。我只想要一个简单的“在此处插入代码”方法,可以在编译时一次引入代码。

总结:

  1. (必需)将代码从外部文件导入到包命名空间
  2. (必需)仅在编译时或运行时开销最小时执行此操作
  3. (必需)不扩展类
  4. (所需)荣誉插入位置范围

下面带有“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;

也许是一个带有 slurp 和 eval 的 BEGIN block ......

最佳答案

您可以只使用模块并导入所需的子程序。

use MyMod qw( wanted_sub_1 wanted_sub2 );

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

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

MyModimport 将创建在初始哈希参数上封闭的代码引用,并将它们安装到 MyClass 命名空间中。

关于perl - 如何在编译时从外部文件导入 Perl 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2282362/

相关文章:

c - 在 C 中操作字符串 Perl SV

PERL - 正则表达式包括所有哈希键(已排序)+从读取的文件中的 $_ 中删除空字段

perl - 基于第二个数组从数组中删除元素

javascript - CGI 脚本问题

perl - Perl 中的对称和传递自定义单位转换

Perl 模块依赖组织和包含顺序

perl - 在 Perl 中,如何访问另一个包中定义的标量?

perl - 设置Perl模块参数并同时使用Exporter

macos - OS X 的 Perl 和 CPAN 升级帮助

perl - 帮助在 Perl 中传递对类子例程的引用