perl subs何时将参数作为`$_`传递,什么时候是`$_[0]`?

问题描述 投票:0回答:1

我注意到 Parallel::Loops 模块使用

$_
作为其 subref 的参数。这个问题本身与 Parallel::Loops 无关,而是关于 coderef 调用约定。

这是他们的示例,请注意

$_
被传递给子:

$pl->foreach( \@parameters, sub {
    # This sub "magically" executed in parallel forked child
    # processes
 
    # Lets just create a simple example, but this could be a
    # massive calculation that will be parallelized, so that
    # $maxProcs different processes are calculating sqrt
    # simultaneously for different values of $_ on different CPUs
    # (Do see 'Performance' / 'Properties of the loop body' below)
 
    $returnValues{$_} = sqrt($_);
});

...但我总是使用

$_[0]
@_
作为传递给子组件的值:

$a = sub { print "\$_=$_\n" ; print "\$_[0]=$_[0]\n" };
$a->(1);

# prints out
# $_=
# $_[0]=1

请注意,在我的示例中,

$_
不起作用,但
$_[0]
(即
@_
)起作用。 Parallel::Loops 示例中的 coderef 和我示例中的 coderef 有什么不同?

请注意,他们的示例不是拼写错误:它仅在您使用

$_
时才有效,这就是我提出这个问题的原因。

perl arguments parameter-passing function-reference coderef
1个回答
0
投票

注意在我的示例中 $_ 不起作用

因为你从未设置过

$_
,与以下片段不同:

local $_ = 1;
$a->();
$a->() for 1;
© www.soinside.com 2019 - 2024. All rights reserved.