代码之家  ›  专栏  ›  技术社区  ›  Mike

关于在Perl中使用函数数组

  •  0
  • Mike  · 技术社区  · 14 年前

    我们正在尝试构建一个API来自动支持commit()和rollback(),这样我们就不必再为它操心了。通过研究,我们发现 eval {} 是一条路要走。

    为了 评估{} foreach 不需要API解释任何东西。但是,此函数可能位于不同的包中。

    让我举个例子来说明:

    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 ,即使我们的API没有 use OSA::SQL . 如果不是,如果指针指向内存中的已知函数,是否可以使用数组引用而不是数组?

    注意:这是我们想要在更复杂的最终版本基础上的基本思想。

    1 回复  |  直到 14 年前
        1
  •  4
  •   DVK    14 年前

    • 您没有向数组添加函数指针。您正在添加调用add\u page()子例程的返回值。您有3种解决方案:

      答。你将需要把它储存在 @functions )形式的数组引用数组 [\&OSA::SQL::add_page, @argument_values] ,这意味着您传入了对子例程的实际引用(静态调用);然后exec\u 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";
          }
      }
      

      为了重新迭代,这将在静态版本中调用各个sub( OSA::SQL::add_page OSA::SQL->add_page 会的。如果您想要后者,请参阅下一个解决方案。


      你将需要把它储存在 @功能 [sub { OSA::SQL->add_page(@argument_values) }] ,这意味着您传入对子例程的引用,该子例程将依次调用您需要的内容;然后exec\u multi将执行以下操作(语法可能不是100%正确,因为这里是凌晨4点)

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

      )形式的数组引用数组 [ "OSA::SQL", "add_page", @argument_values] ,表示传入一个包和函数名;然后exec\u multi将执行以下操作(语法可能不是100%正确,因为这里是凌晨4点)

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

    • 如果我正确理解了您的问题,那么您就不必担心我们的api是否使用OSA::SQL,因为您的主代码已经导入了它。

      require $package; $package->import(); “在exec\ u multi中。但是,如果您的处理程序调用已经需要并加载了这些包中的每一个,那么这也是完全没有必要的。要做到这一点,您需要将参数列表传递给 import() 也。但是为什么