加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何创建内存类,然后将其包含在Perl中?

发布时间:2020-12-15 23:33:05 所属栏目:大数据 来源:网络整理
导读:所以我在Perl玩弄了一些黑魔法(最终我们都做了:-)而且我对我应该如何做这一切感到困惑.这是我开始的: use strict;use warnings;use feature ':5.10';my $classname = 'Frew';my $foo = bless({ foo = 'bar' },$classname);no strict;*{"$classname::INC"}
所以我在Perl玩弄了一些黑魔法(最终我们都做了:-)而且我对我应该如何做这一切感到困惑.这是我开始的:

use strict;
use warnings;
use feature ':5.10';
my $classname = 'Frew';
my $foo = bless({ foo => 'bar' },$classname);
no strict;
*{"$classname::INC"} = sub {
      use strict;
      my $data =  qq[
         package $classname
         warn 'test';
         sub foo {
            print "test?";
         }
      ];
      open my $fh,'<',$data;
      return $fh;
   };
use strict;
unshift @INC,$foo;
require $foo;
use Data::Dumper;
warn Dumper(@INC);
$classname->foo;

我收到以下错误(取决于我的需求行是否被注释掉):

有要求:

Recursive call to Perl_load_module in PerlIO_find_layer at crazy.pl line 16.
BEGIN failed--compilation aborted.

无:

$VAR1 = [
      bless( {
               'foo' => 'bar'
             },'Frew' ),'C:/usr/site/lib','C:/usr/lib','.'
    ];
Can't locate object method "foo" via package "Frew" at crazy.pl line 24.

任何知道某些黑魔法的巫师:请回答!我想更多地了解这个奥秘:-)

还要注意:我知道我可以使用Moose和其他更轻的辅助模块来做这种事情,我主要是想学习,所以使用这样一个模块的建议不会得到我的投票:-)

更新:好的,我想我原本不清楚我的问题.我基本上想要基于外部数据结构生成带有字符串的Perl类(我将操作并插入).我想,从我这里的东西(一旦它起作用)到那不应该太难.

解决方法

这是一个有效的版本:

#!/usr/bin/perl

use strict;
use warnings;

my $class = 'Frew';

{
    no strict 'refs';
    *{ "${class}::INC" } = sub {
        my ($self,$req) = @_;
        return unless $req eq  $class;
        my $data = qq{
            package $class;
            sub foo { print "test!n" };
            1;
        };
        open my $fh,$data;
        return $fh;
    };
}

my $foo = bless { },$class;
unshift @INC,$foo;

require $class;
$class->foo;

@INC钩子获取文件的名称(或传递给require的字符串)作为第二个参数,并在每次有需要或使用时调用它.所以你必须检查以确保我们正在尝试加载$classname并忽略所有其他情况,在这种情况下perl沿着@INC继续向下.或者,您可以将钩子放在@INC的末尾.这是递归错误的原因.

ETA:恕我直言,更好的方法是简单地动态构建符号表,而不是生成代码作为字符串.例如:

no strict 'refs';
*{ "${class}::foo" } = sub { print "test!n" };
*{ "${class}::new" } = sub { return bless { },$class };

my $foo = $class->new;
$foo->foo;

没有必要使用或要求,也没有弄乱邪恶的@INC钩子.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读