需要匿名数据结构

时间:2017-12-11 20:21:04

标签: perl

在perl中是否需要匿名数据结构?

<div class="row">
    <div class="col-md-3 image-selector">
        <input checked="checked" id="one" name="image" value="one" type="radio">
        <label class="select one" for="one"></label>
    </div>
    <div class="col-md-3 image-selector">
        <input id="two" name="image" value="two" type="radio">
        <label class="select two" for="two"></label>
    </div>
    <div class="col-md-3 image-selector">
        <input id="three" name="image" value="three" type="radio">
        <label class="select three" for="three"></label>
    </div>
    <div class="col-md-3 image-selector">
        <input id="four" name="image" value="four" type="radio">
        <label class="select four" for="four"></label>
    </div>
</div>

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

这是我正在做的更具体的例子。请记住,数据对象将比提供的数据对象大得多。

#test.pl
(
  "example_data" => 1
)

#main.pl
require "test.pl";
%some_data = (%some_data, $);

主要目的是我希望能够使用数据对象作为脚本逻辑的模板/配方轻松生成新的perl脚本,并将实现留给Schedular模块。这也很容易让我将新事件推送到日程安排上并动态添加新的日程安排。

2 个答案:

答案 0 :(得分: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,因为我猜测您需要用户提供的代码。

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

答案 1 :(得分:0)

  

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

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

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

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