有没有办法在Perl中获取一个匿名数组末尾的切片?

Eli*_*Eli 13 perl

所以这让我在过去的半小时里疯狂了.有没有办法让我在一个匿名数组的末尾抓取一个数组切片?我已经尝试过了:

(split(' ',$test_line))[1..$#_]

我已经尝试过了, (split(' ',$test_line))[1..-1]

但是加剧了这些工作.我真的不希望有一个额外的临时变量实例化到中间数组(我不需要).我真的不想使用丑陋且难以理解的一个班轮(在网上找到一些).真的没有直接的方法来做到这一点吗?

Eri*_*rom 15

列表就是您示例中的内容,无法从最终切片.这主要是因为列表不是Perl中的正确数据结构,而是解释器用于移动数据的更多构造.因此,知道您只能从开头切片列表,您的选择是将其放入数组变量然后切片,更改算法以返回您想要的内容,或者以下内容:

如果要将此值分配给某些内容,则可以undef在不需要的每个插槽中使用:

 my (undef, @list) = split ' ' => $test_line;
Run Code Online (Sandbox Code Playgroud)

如果你发布更多代码,我可以修改.

或者,您可以使用函数式编程中的一些工具.一对功能droptake可能是有用的调整,无需额外的变量列表:

sub take {
    my $n = shift;
    @_[0..$n-1]
}
sub drop {
    my $n = shift;
    @_[$n..$#_]
}
Run Code Online (Sandbox Code Playgroud)

然后你的例子就变成了

drop 1, split ' ' => $test_line;
Run Code Online (Sandbox Code Playgroud)

drop 1 也常被称为 tail

sub tail {drop 1, @_}
Run Code Online (Sandbox Code Playgroud)

当然,由于所有这些都很短,如果你想内联它:

sub {shift; @_}->(split ' ' => ...)
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案.有*单线解决方案,但它们实际上不属于生产代码. (3认同)

soc*_*pet 6

当OP说切片时,我想到splice:

@allTheWordsExceptTheFirstTwo = splice @{[split' ', $test_line]}, 2;
@allExceptTheFirstAndLastTwo = splice @{[split' ', $test_line]}, 2, -2;
Run Code Online (Sandbox Code Playgroud)