这似乎是一个愚蠢的问题,但这是漫长的一天。我正在调整一些Perl代码以供其他用途,我遇到了这种语法:
my @request;
#... fill the array with stuff...
my $reply = $service->call('requestMessage' => @request, $header);
如果=>
只是一种特殊的逗号而且@request被插入到列表中,那么该方法调用似乎难以置信。
它实际上相当于:
my $reply = $service->call('requestMessage' => \@request, $header);
这里发生了什么?
编辑:感谢您的回答。我很清楚传递值和传递参考之间的区别。我问的是,一个明显的值传递是否被转换为参考传递。显然不是。谢谢大家回答。
答案 0 :(得分:10)
有问题的代码:
my $reply = $service->call('requestMessage' => @request, $header);
是 不 等同于:
my $reply = $service->call('requestMessage' => \@request, $header);
正如你所推测的那样,相当于:
my $reply = $service->call('requestMessage', @request, $header);
有时,已知=>
的“胖逗号”用于表示位置参数之间的关系。例如,此代码中方法名称some_method
与其预期@arguments
之间的链接:
$server->distribute_across_nodes(some_method => @arguments);
答案 1 :(得分:8)
将数组放在=>右侧时会发生什么?操作
=>
是fat comma。它对 RHS 无影响。如果LHS是bareword,它会自动引用LHS。
你的问题的其余部分似乎归结为如果将函数传递给数组与引用数组之间存在差异:是的,有。在第一种情况下,数组被展平并传递给函数。因此,如果数组有1,000个元素,函数参数列表将增加1,000个元素。
在第二种情况下,传递对数组的引用,因此参数列表的大小不依赖于传递给函数的引用所指向的数组的大小。
答案 2 :(得分:5)
有一种思想流派=>应该被用作某种强调逗号,即使它没有任何区别。倡导者用它来表明一件事描述或作用于另一件事,例如:
split /,/ => $var;
也许你的代码的作者属于这个阵营?
答案 3 :(得分:2)
查看SOAP :: Lite代码,它最终会进行此调用
$serializer->envelope(method => shift, @_)
所以你的原始电话
$service->call('requestMessage' => @request, $header);
只是使用胖逗号强调(@request, $header )
的内容将成为soap调用requestMessage
的参数。这不太清楚,因为$ header是参数的一部分,但约定并没有说清楚。我会说,在这种情况下,胖逗号没有添加任何东西。
我看过CGI脚本中使用的“强调逗号”,如此(未经测试)
$q->param(foo => $bar)
我认为这表明这个调用会设置参数foo。但显然这也可能令人困惑。请谨慎使用。
答案 4 :(得分:1)
它会传递"requestMessage"
,然后传递@request
中的所有值(作为第2,第3 ......等参数),然后传递$header
。这些可能会被强制成哈希。
以下是一个例子:
perl -MData::Dumper -e '@a = (1, 2, 3, 4);
%b = ('a' => @a, 'c');
print Dumper(\%b);'
$VAR1 = {
'4' => 'c',
'a' => 1,
'2' => 3
};
所以在这种情况下,它与
相同%b = ('a' => 1, 2 => 3, 4 => 'c');