perl - 我应该如何修改原型(prototype)以允许在 coderef 之后构造散列?

标签 perl subroutine-prototypes

这就是我所拥有的:

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/

相关文章:

python - 从 perl 运行 python 脚本,参数为 stdin 并保存 stdout 输出

perl - 为什么我不能从 TextMate 运行 Perl 程序?

xml - 使用 Perl 的 XML 标签内的总和和平均值

perl - 为什么我们不能在列表上下文中初始化状态数组/哈希?

perl - 采用可选 block 参数的子例程

perl - 如何在运行时获取子程序的签名?

perl - 我将如何解决以下错误 "Undefined subroutine &main::resetCounters called at"?

css - 如何在 Gtk3 可选标签中设置光标颜色?