我注意到 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 有什么不同?
请注意,他们的示例不是拼写错误:它仅在您使用
$_
时才有效,这就是我提出这个问题的原因。
注意在我的示例中 $_ 不起作用
因为你从未设置过
$_
,与以下片段不同:
local $_ = 1;
$a->();
$a->() for 1;