【问题标题】:How to deref @$_?如何取消引用@$_?
【发布时间】:2014-05-15 19:14:17
【问题描述】:

我正在这样做:

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();

当它执行时,我得到:

线程 8 异常终止:不能使用字符串(“8”)作为 ARRAY 引用,而“严格引用”正在使用(@上面引用的行)

我在这里做错了什么?

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

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

用户可以在哪里指定他们何时运行脚本,$actions 他们希望在组件(目录)上执行。

【问题讨论】:

  • 关闭 use strict 是否有效
  • @Jeef 关闭strict 是一个可怕的想法。如果 strict 不能正常工作,你应该修复代码,而不是关闭 strict
  • 为什么参数后面是作业类型。你写("Hello, World!")print;
  • 为什么你有两个不同的东西命名为$job

标签: perl parameters


【解决方案1】:

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

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

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

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


现在,如果我们撤消 OP 所做的所有更改,我们会返回使用更合理的参数顺序和不使用名称 $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();

【讨论】:

  • 如此简单!在幕后,这是如何从@{$_[0]} 中提取$job@action 的?如果我想提取多个参数怎么办(例如,如果我使用$q-&gt;enqueue([$_, 'clean', 'l1', '']) for @compsCopy; 调用?
  • 把第一行想象成my ($arrayref) = @_; my ($job, @action) = @$arrayref; 当然,这是假设你传递的参数确实是一个数组引用。
  • 谢谢 - 我已经更新了我的问题,提供了更多细节。
  • 这是一个有用的更新。也更新了我的答案,以提供更多信息并阐明我对您的变量名选择的建议。
猜你喜欢
  • 2013-09-15
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-22
  • 2014-07-23
  • 1970-01-01
  • 2016-05-31
  • 1970-01-01
相关资源
最近更新 更多