这就是我所拥有的:
use 5.14.0;
use strict;
use warnings;
sub my_func(&$) {
my $coderef = shift;
my %attribs = @_;
}
这就是我想要实现的目标:
my_func {
print 1;
} first_attrib => "1",second_attrib => "2";
但是,我收到错误
Too many arguments for main::my_func at x.pl line 12, near ""2";"
.应该如何修改原型(prototype),让coderef后面的参数转化为hash?
最佳答案
如果您将 sub my_func(&$)
更改为 sub my_func(&%)
您的代码将起作用。
问题是 first_attrib => "1",second_attrib => "2"
不是哈希引用,而是一个列表。正如friedo 指出的那样,可以将列表分配给哈希,尽管具有奇数个元素的列表可能会产生不需要的结果,并且会产生带有 use warnings
的警告。
或者,您可以将代码更改为
sub my_func(&$) {
my $coderef = shift;
my ($attribs) = @_;
}
my_func {
print 1;
} {first_attrib => "1",second_attrib => "2"};
实现你似乎想要的。
必须将
$attribs
包装在括号中的原因是将数组分配给标量仅返回数组中元素的数量。此时@_
就是这个数组:({first_attrib => "1",second_attrib => "2"})
将哈希引用作为单个元素。
($attribs) = @_;
告诉 perl 创建一个以标量
$attribs
作为其第一个元素的匿名数组,并将 @_
中的元素逐个元素分配给匿名数组,从而使 $attribs
指向 @_
中的哈希引用。
关于perl - 我应该如何修改原型(prototype)以允许在 coderef 之后构造散列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8534657/