arrays - 在 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()
) 并正确传递它。
解决方案
如果我理解正确,问题可以总结如下:
我有一个行数组
@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)
]
)
推荐阅读
- docker-compose - 使用 docker-compose 服务名称从 LocalStack lambda 函数连接到数据库容器
- c# - 我必须在输入之前指定 UnityEngine
- python - 如何从 flask-SQLAlchemy 查询 SQL 视图
- javascript - Finnesing fullcallendar; 列表视图序数
- r - 尝试连接到 R 上的 mongodb 时找不到合适的服务器
- r - 如何计算两列之间的时间差?
- python - 如何在 PySimpleGUI 中一次将多个窗口全屏显示
- javascript - 多个可选捕获组的正则表达式模式
- spring-cloud-stream - Spring Cloud Stream中如何添加或调整文件供应商的配置
- python - 从标准数组中删除选定的值 - mongodb + python