如何创建内存类,然后将其包含在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钩子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |