gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:45:45 25 4
gpt4 key购买 nike

这就是我所拥有的:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com