首页 > 解决方案 > 在 Perl 中使用循环将参数传递给匿名数组

问题描述

我在理解这个 Perl 模块时遇到了问题,我对 Perl 很陌生,主要逻辑在里面ExternalLibrary::registerJob,它的执行如下所示,提到ExecutionBlock的对我来说是一个黑盒子,我只知道我可以在里面列出unitFunc()几个tasksequence

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 };
}

我想修改它,以便我可以jobName在那里传递多个 s,registerJob可以接受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 };
}

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

标签: arraysloopsperl

解决方案


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

我有一个行数组@res。每行都是对带有JOB_NAME元素的哈希的引用。

我想执行以下操作,以使每一行都产生一个由行元素jobName的值给出的任务:JOB_NAME

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)
  ]
)

推荐阅读