You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl 6中能否通过哈希传递命名参数?如何正确实现?

在Perl 6中使用哈希传递命名参数的正确方法

当然可以用哈希传递命名参数!你遇到的报错其实是个常见小坑——直接把哈希传给只接受命名参数的子例程时,Perl 6会把整个哈希当作一个位置参数处理,而你的adding子例程明确要求0个位置参数、只接受命名参数,所以才会抛出「Too many positionals passed」的错误。

解决这个问题的关键是用Perl 6的双星号展开操作符(**),它的作用就是告诉编译器:把哈希里的键值对拆解成对应的命名参数传递给子例程。

正确实现的完整示例

sub adding(:$first, :$second) { $first + $second }

# 直接传递命名参数,正常运行
say adding(second => 2, first => 1); # 输出: 3

# 用哈希存储命名参数
my %param = second => 2, first => 1;
say %param; # 输出: {first => 1, second => 2}

# 使用**展开哈希,作为命名参数传递
say adding(**%param); # 输出: 3

额外小技巧:处理多余的哈希键

如果你的哈希里包含子例程不需要的键,直接用**%param会报错。这时候可以在子例程定义里加上*%来接受并忽略所有额外的命名参数:

# 新增*%来接收多余的命名参数
sub adding(:$first, :$second, *%) { $first + $second }

my %param = second => 2, first => 1, third => 3;
say adding(**%param); # 依然输出3,自动忽略third参数

内容的提问来源于stack exchange,提问作者Eugene Barsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:33:09