Perl 6中与Python星号表达式等价的语法是什么?
Python星号表达式在Perl 6中的等价实现问题解决
嘿,我来帮你搞定这个Perl 6的语法问题~你遇到的报错核心原因是Perl 6和Python的语法规则不一样:带有*的slurpy参数(用来捕获任意数量剩余元素的参数)必须放在参数列表的最后位置,没法像Python那样把可变长度的捕获放在中间,再跟其他必填参数。所以你原来写的($first, *@middle, $last)这种解构方式违反了Perl 6的语法规则,才会弹出"Cannot put required parameter $last after a slurpy parameter"的错误提示。
下面给你两种可行的解决方案,都能实现和Python代码完全一致的功能——剔除第一次和最后一次作业成绩,计算剩余成绩的平均值:
方案一:利用数组切片直接提取中间元素
这是最简洁直观的写法,直接通过数组索引范围跳过首尾元素:
sub drop_first_last(@grades) { # 取索引1到倒数第二个元素(Perl 6中*-2表示倒数第2个元素的索引) my @middle = @grades[1..*-2]; # Perl 6数组自带avg方法,直接调用即可 return @middle.avg; } # 调用测试,输出结果为67 say drop_first_last(100,68,67,66,23);
方案二:先解构首元素+剩余元素,再弹出尾元素
如果你更倾向于用解构的思路,可以先拆分出首元素和所有剩余元素,再从剩余元素中移除最后一个:
sub drop_first_last(@grades) { # 先拆分出第一个元素和剩下的所有元素 my ($first, *@rest) = @grades; # 弹出最后一个元素,剩下的@rest就是中间部分 my $last = @rest.pop; return @rest.avg; } # 调用测试,同样输出67 say drop_first_last(100,68,67,66,23);
两种方案都能正确处理你的测试用例,算出中间三个成绩的平均值67~
内容的提问来源于stack exchange,提问作者chenyf
相关产品推荐
相关产品推荐

