在 Perl 中使用循环将参数传递给匿名数组

Pass parameters to anonymous array with loop in Perl

我在理解这个 Perl 模块时遇到问题,我是 Perl 的新手,主要逻辑在 ExternalLibrary::registerJob 中,它的执行如下所示,提到的 ExecutionBlock 是一个黑框对于我和我所知道的,我可以在 tasksequence.

中列出几个 unitFunc()
tasksequence=>[
        $ic->unitFunc('ExternalLibrary::registerJob', jobName=>'JOB1'),
        $ic->unitFunc('ExternalLibrary::registerJob', jobName=>'JOB2'),
        $ic->unitFunc('ExternalLibrary::registerJob', jobName=>'JOB3')
      ]

模块部分,这是我们应该使用的模板模式:

sub myFunc{
  my %args=@_;
  my $ic = $args{'initialcontext'};
 
  my $basetasksequence = [
    new ExecutionBlock(
      initialcontext=>$ic,
      tasksequence=>[
        $ic->unitFunc('ExternalLibrary::registerJob')
      ]
    )
  ];
 
  my $runtasksequence = [
    new ExecutionBlock(
      initialcontext=>$ic,
      tasksequence=>$basetasksequence
    )
    ->errCallBack($ic->unitFunc('ExternalLibrary::logger', kind=>"J", status=>"F",RunTaskSequence=>$basetasksequence))
  ];
 
  return { tasksequence=>$runtasksequence };
}

我想修改它,这样我就可以在那里传递多个 jobNameregisterJob 可以接受 jobName 作为参数,这是对我的提示。

$ic->unitFunc('ExternalLibrary::registerJob', jobName=>$jobName)

但是我不知道如何正确地循环这个问题,甚至不知道如何命名问题以便我可以查找问题并阅读主题。试图了解下落对我来说有点困难。

我可以从类似这样的循环中得到 jobName

my @res= $ic->DBHandler::sql(sql=>$statementQuery);
foreach my $list(@res){
  $jobName = $list->{'JOB_NAME'};
}

但我不确定如何将它们组合在一起,是否可以 运行 像这样在数组中循环?

sub myFunc{
  my %args=@_;
  my $ic = $args{'initialcontext'};

  my $basetasksequence = [
    new ExecutionBlock(
      initialcontext=>$ic,
      tasksequence=>[
      my @res= $ic->DBHandler::sql(sql=> $statementQuery);
      foreach my $list(@res){
        $jobName = $list->{'JOB_NAME'};
        $ic->unitFunc('ExternalLibrary::registerJob', jobName=>$jobName)
      }
      ]
    )
  ];

  my $runtasksequence = [
    new ExecutionBlock(
      initialcontext=>$ic,
      tasksequence=>$basetasksequence
    )
    ->errCallBack($ic->unitFunc('ExternalLibrary::logger', kind=>"J", status=>"F",RunTaskSequence=>$basetasksequence))
  ];

  return { tasksequence=>$runtasksequence };
}

我想我需要另一个函数来 return 整个数组,然后将其分配给 tasksequence,但我不知道如何保留所需的形式 ($ic->unitFunc())并正确传递。

如果我理解正确,问题可以总结如下:

I have an array of rows @res. Each row is a reference to a hash with a JOB_NAME element.

I want to do the following such that each row results in a task with jobName given by the value of the row's JOB_NAME element:

new ExecutionBlock(
  initialcontext=>$ic,
  tasksequence=>[
    $ic->unitFunc('ExternalLibrary::registerJob', jobName=>'JOB1'),
    $ic->unitFunc('ExternalLibrary::registerJob', jobName=>'JOB2'),
    $ic->unitFunc('ExternalLibrary::registerJob', jobName=>'JOB3')
  ]
)

[] 创建一个数组,这就是我们要做的。

my @rows = $ic->DBHandler::sql(sql=>$statementQuery);

my @task_sequence;
for my $row (@rows) {
  push @task_sequence,
    $ic->unitFunc('ExternalLibrary::registerJob', jobName=>$row->{JOB_NAME});
}

new ExecutionBlock(
  initialcontext=>$ic,
  tasksequence=>\@task_sequence
)

我会使用以下更简单的解决方案:

new ExecutionBlock(
  initialcontext=>$ic,
  tasksequence=>[
    map { $ic->unitFunc('ExternalLibrary::registerJob', jobName=>$_->{JOB_NAME}) }
       $ic->DBHandler::sql(sql=>$statementQuery)
  ]
)