我们正在努力建设一个API支持犯()和rollback()自动的,所以,我们没有打扰了。通过研究,我们发现,使用 eval {} 是的路要走。

对于 eval {} 知道要做什么,我曾经想过给予API一系列功能,它可以执行一个 foreach 没有API有intepret任何东西。然而,这种功能可能是在一个不同的软件包。

让我澄清一个例子:

sub handler {
    use OSA::SQL;
    use OSA::ourAPI;
    my @functions = ();
    push(@functions, OSA::SQL->add_page($date, $stuff, $foo, $bar));
    my $API = OSA::ourAPI->connect();
    $API->exec_multi(@functions);
}

问题是:是它能够执行功能 @functions 里面的 OSA::ourAPI, 即使ourAPI没有 use OSA::SQL.如果没有,是否有可能如果我使用一系列参考,而不是一个数组,鉴于指针就会指向已知的功能内部的记忆?

注:这是基本的想法,我们希望为基础的更复杂的最终版本。

有帮助吗?

解决方案


  • 你是不是添加一个功能的指针到你的阵列。你加德返回值的调add_page()子程序。你有3个解决方案:

    A.你会需要储存(在 @functions)一系列arrayrefs的形式 [\&OSA::SQL::add_page, @argument_values], ,这意味着你通过在一个实际参考的一个子程序(称为静态);然后exec_multi会这样做(法可能不是100%正确的,因为它是凌晨4点在这里)

    sub exec_multi {
        my ($class, $funcs)= @_;
        foreach my $f (@$funcs) {
            my ($func, @args) = @$f;
            my $res = &$func(@args);
            print "RES:$res\n";
        }
    }
    

    只是为了重申,这将呼叫个人潜水艇中的静态版本(OSA::SQL::add_page),例如没有通过包名称为第一个参数作为一类叫 OSA::SQL->add_page 会的。如果你想要后者,见下一个解决方案。


    B。如果你想要呼叫你的潜艇在类环境(如在例,换句话说,与类的名字作为第一个参数),可以使用ysth的建议的评论。

    你会需要储存(在 @functions)一系列arrayrefs的形式 [sub { OSA::SQL->add_page(@argument_values) }], ,这意味着你通过在一个参考的一个子程序,这将反过来叫你的需要;然后exec_multi会这样做(法可能不是100%正确的,因为它是凌晨4点在这里)

    sub exec_multi {
        my ($class, $funcs)= @_;
        foreach my $f (@$funcs) {
            my ($func) = @$f;
            my $res = &$func();
            print "RES:$res\n";
        }
    }
    

    C.你会需要储存(在 @functions)一系列arrayrefs的形式 [ "OSA::SQL", "add_page", @argument_values], ,这意味着你通过在一个软件包和职能名称;然后exec_multi会这样做(法可能不是100%正确的,因为它是凌晨4点在这里)

    my ($package, $sub, @args) = @{ $functions[$i] };
    no strict 'refs';
    $package->$sub(@args);
    use strict 'refs';
    

  • 如果我理解你的问题是正确的,那么你不需要担心是否ourAPI使用OSA::SQL,由于你的主要进口量的代码了。

    然而,由于在#1B-你将通过一个清单的软件包exec_multi作为第一要素的每个arrayref,你可以做"require $package; $package->import();"在exec_multi.但是,这是完全不必要的,如果你的处理程序的呼叫已经需要和装载的每一个这些软件包。和它做好你需要通过在一个列表中的参数 import() 为好。但WHYYYYYY?:)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top