gpt4 book ai didi

perl - 如何解引用@$_?

转载 作者:行者123 更新时间:2023-12-02 04:31:58 24 4
gpt4 key购买 nike

我正在这样做:

sub worker {
my ($job, @action) = @$_; #<-- error thrown here
Build($job, @action[0]);
}


for (1..NUM_WORKERS) {
async {
while (defined(my $job = $q->dequeue())) {
worker($job);
}
};
}

$q->enqueue([$_, 'clean']) for @compsCopy;

# When you're done adding to the queue.
$q->end();
$_->join() for threads->list();

当执行时,我得到:

Thread 8 terminated abnormally: Can't use string ("8") as an ARRAY ref while "strict refs" in use (@ the line referenced above)

我在这里做错了什么?

编辑:为了更深入地了解我想要完成的任务,我希望能够执行以下操作:

$q->enqueue([$_, 'clean']) for @compsCopy; #clean
$q->enqueue([$_, 'l1']) for @compsCopy; #build
$q->enqueue([$_, '']) for @compsCopy; #link

用户可以在运行脚本时指定他们想要在组件(目录)上执行的 $action

最佳答案

如果worker的第一个参数是数组引用,则执行以下操作:

sub worker {
my ($job, @action) = @{$_[0]};

$_@_ 可能看起来相似,但它们是不同的变量。使用数组 @_ 来访问传递给该子例程的参数。 $_[0] 将保存该数组的第一个元素。

注意:我建议您为 worker 子函数的第一个捕获参数起一个不同的名称。重用 $job 很令人困惑。在 sub 内部,它看起来像 my ($val, @action) = ... 在语义上可能更准确。


现在,如果我们撤消 OP 所做的所有更改,我们会得到使用更合理的参数顺序的内容,并且 a 不会将名称 $job 用于两个不同的事物。

sub worker {
my ($job) = @_;
my ($job_type, @job_params) = @$job;

if ($job_type eq 'clean') {
clean(@job_params);
}
# elsif ($job_type eq '...') {
# ...
# }
# ...
}


for (1..NUM_WORKERS) {
async {
while (defined(my $job = $q->dequeue())) {
worker($job);
}
};
}

$q->enqueue([ clean => $_ ]) for @compsCopy;

# When you're done adding to the queue.
$q->end();
$_->join() for threads->list();

关于perl - 如何解引用@$_?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22846441/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com