我应该如何修改原型以允许在coderef之后构造哈希?

Geo*_*Geo 9 perl subroutine-prototypes

这就是我所拥有的:

use 5.14.0;
use strict;
use warnings;

sub my_func(&$) {
    my $coderef = shift;
    my %attribs = @_;
}
Run Code Online (Sandbox Code Playgroud)

这就是我想要实现的目标:

my_func {
    print 1;
} first_attrib => "1",second_attrib => "2";
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误Too many arguments for main::my_func at x.pl line 12, near ""2";".我应该如何修改原型,以便将coderef之后的参数转换为哈希?

fle*_*esk 8

如果您更改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"};
Run Code Online (Sandbox Code Playgroud)

实现你想要的东西.

你必须$attribs在parens中包装的原因是将数组赋给标量只返回数组中元素的数量.此时@_是这个数组:

({first_attrib => "1",second_attrib => "2"})
Run Code Online (Sandbox Code Playgroud)

将哈希引用作为单个元素.

($attribs) = @_;
Run Code Online (Sandbox Code Playgroud)

告诉perl创建一个以标量$attribs作为其第一个元素@_的匿名数组,并逐个元素地将元素分配给匿名数组,从而$attribs在散列引用中指向@_.

  • 更确切地说,`first_attrib =>"1",second_attrib =>"2"`是*list*,并且可以将列表分配给散列. (2认同)