gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 06:58:12 24 4
gpt4 key购买 nike

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

背景:

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

我已经将 AutoLoader 视为完成此任务的一种手段。但是,有两件事让我停下来。如果我能解决这些问题,它可能是一个近乎最佳的解决方案:

  • 我不想将每个小子拆分成一个单独的文件;只是一些更合理大小的文件(尽管在调用者中使用子 stub 很好);和
  • 我不想推迟每个子的编译;我想在初次使用时编译一些潜艇。但是,这可能不会破坏交易。

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

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

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

    总之:
  • (必需)将外部文件中的代码导入包命名空间
  • (必需)仅在编译时或最小运行时开销时这样做
  • (必需)不扩展类
  • (期望)荣誉插入位置范围

  • 带有“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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com