有没有必要在perl中要求匿名数据结构?
#test.pl
(
"example_data" => 1
)
#main.pl
require "test.pl";
%some_data = (%some_data, $);
如果1不像sub那样需要隐式返回数据结构吗?
这是我正在做的更具体的例子。请记住,数据对象将比提供的数据对象大得多。
#main.pl
use Schedular(
\%CONFIG,
do "default.pl"
);
#spawn new process for each schedule
Schedular::run_schedulue("some_schedule");
Schedular::run_schedulue("some_other_schedule");
#Schedular.pm
package Schedular;
our %schedules = undef;
our %config = undef;
sub import{
%config= shift @_;
%schedules = shift @_;
}
sub run_schedule{
#Run each event in schedule
}
sub do_something{
print("Hello World");
}
#default.pl
(
"some_schedule"=>[
sub {
#Event
Schedular::do_something();
},
sub {
#Event 2
}
],
"some_other_schedule"=>[
sub {
#Event 3
},
]
)
1;
主要目的是我希望能够使用数据对象作为脚本逻辑的模板/配方轻松生成新的perl脚本,并将实现留给Schedular模块。这也很容易让我将新事件推送到时间表上并动态添加新的时间表。
如果1不像sub那样需要隐式返回数据结构吗?
我不确定这是否有记录,但答案是:排序,但没有。
第一次使用require
文件时,它将返回最后一个表达式的值,就像一个子程序(或者真的像do
一样)。但是同一文件的任何后续require
将只返回1
。
这意味着使用require
从文件中获取有意义的值不是一种可靠的方法。如果其他人(例如由您加载的另一个模块加载的模块)先加载了该文件,您将只看到1
。
我不确定为什么这么难以澄清。
以下是对具体事物的尝试:从模块子中返回code reference。当运行由来自调用者(和其他模块)的数据驱动到任何复杂性时,该代码返回的内容。
模块CodeGen.pm
package GiveCode;
use warnings;
use strict;
use Data::Dump qw(pp);
use FuncStubs qw(f_stub);
use Exporter qw(import);
our @EXPORT_OK = qw(get_coderef);
sub get_coderef {
my @pars = @_;
# Any variables declared here and used in sub
# will still exist in the caller ("closure")
my $rc = sub {
my @rc_pars = @_;
my $data = pp \@rc_pars; # for demo
my $hashref = {
key => $data, func => \&f_stub
};
return $hashref;
};
return $rc;
}
1;
和实用程序FuncStubs.pm
与用户提供的代码
package FuncStubs;
use warnings;
use strict;
use Exporter qw(import);
our @EXPORT_OK = qw(f_stub);
sub f_stub { print "In ", __PACKAGE__, ", got: @_\n" }
1;
来电者,你的main.pl
use warnings;
use strict;
use Data::Dump qw(dd);
use CodeGen qw(get_coderef);
my $data = { from_main => 'some_data' };
my $rc = get_coderef($data);
my $ret = $rc->($data);
dd $ret;
$ret->{func}->("From_" . __PACKAGE__) ;
这打印
{ func => sub { ... }, key => "[{ from_main => \"some_data\" }]" } In FuncStubs, got: From_main
get_coderef
使用$data
来构建它返回的代码引用。那个$rc
可以随意运行,有自己的论据。随着代码更改的需要,您可以使用新数据再次运行get_coderef
,从而构建新的$rc
等。
FuncStubs
也用于构建$rc
,因为我猜你需要用户提供的代码。
我认为您可以使用它来构建一个功能类似于您所描述的系统(但我并不完全理解)。请澄清它与你所谈论的内容之间的关系。