需要匿名数据结构

问题描述 投票:-1回答:2

有没有必要在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模块。这也很容易让我将新事件推送到时间表上并动态添加新的时间表。

perl
2个回答
0
投票

如果1不像sub那样需要隐式返回数据结构吗?

我不确定这是否有记录,但答案是:排序,但没有。

第一次使用require文件时,它将返回最后一个表达式的值,就像一个子程序(或者真的像do一样)。但是同一文件的任何后续require将只返回1

这意味着使用require从文件中获取有意义的值不是一种可靠的方法。如果其他人(例如由您加载的另一个模块加载的模块)先加载了该文件,您将只看到1


0
投票

我不确定为什么这么难以澄清。

以下是对具体事物的尝试:从模块子中返回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,因为我猜你需要用户提供的代码。

我认为您可以使用它来构建一个功能类似于您所描述的系统(但我并不完全理解)。请澄清它与你所谈论的内容之间的关系。

© www.soinside.com 2019 - 2024. All rights reserved.