Perl 6中的等效词与Python中的星形表达式相同?

che*_*nyf 6 variadic perl6 raku

在Python 3中,假设您运行一门课程并在学期结束时决定您将删除第一个和最后一个作业成绩,并且仅对其余成绩进行平均:

def drop_first_last(grades):
    first, *middle, last = grades 
    return avg(middle)

print drop_first_last([100,68,67,66,23]);
Run Code Online (Sandbox Code Playgroud)

在Perl 6中:

sub drop_first_last(@grades) {
    my ($first, *@middle, $last) = @grades;
    return avg(@middle);
}

say drop_first_last(100,68,67,66,23);
Run Code Online (Sandbox Code Playgroud)

导致错误"无法$last在可变参数后放置必需的参数".

那么,在Perl 6中,与Python中的星形表达式相同的是什么?

Kje*_* S. 6

Perl5的:

sub drop_first_last { avg( @_[ 1 .. $#_-1 ] ) }     #this
sub drop_first_last { shift;pop;avg@_ }             #or this
Run Code Online (Sandbox Code Playgroud)

Perl6:

sub drop_first_last { avg( @_[ 1 .. @_.end-1 ] ) }
Run Code Online (Sandbox Code Playgroud)

  • `@_ [0 ^ .. ^*]`我觉得更好 (5认同)
  • 您可以通过执行`@_ [1 .. ^* - 1]来使其更简洁,以获得排除第一个和最后一个元素的数组切片. (3认同)

Eli*_*sen 6

sub drop_first_last(Seq() \seq, $n = 1) { seq.skip($n).head(*-$n) };
say drop_first_last( 1..10 );     # (2 3 4 5 6 7 8 9)
say drop_first_last( 1..10, 2 );  # (3 4 5 6 7 8)
Run Code Online (Sandbox Code Playgroud)

它的工作方式:将第一个参数转换为a Seq,然后跳过$n元素,然后保留除最后一个$n元素之外的所有元素.