gpt4 book ai didi

perl - 如何在 Perl 中指定 "tail slice"?

转载 作者:行者123 更新时间:2023-12-04 14:30:52 27 4
gpt4 key购买 nike

如果我只想提取制表符分隔记录的第 4、5 和 7 个元素(例如),我可以执行以下操作:

my @f = (split(/\t/, $_, -1))[3, 4, 6];

但是如果我想要第 4 个元素和由第 7 个元素到数组末尾的所有元素组成的“尾部切片”怎么办?我不知道如何在一行中做到这一点。我能做的最好的是:
my @f = split(/\t/, $_, -1);
@f = @f[3, 6..$#f];

用两行做这个操作的唯一原因是我可以指定 $#f在第二行,但这需要比任务固有的更大程度的特异性;该任务并不真正关心 split 返回的值中有多少元素。 .能够指定诸如“从第 7 个元素开始可用的所有内容”之类的东西会很好……这就是我所说的“尾部切片”:一个仅指定起点的切片,而终点是隐含的。

(这种规范在 Unix 中 cut 实用程序的使用中很常见;例如:
... | cut -f 4,7-

)

Is there some subscripting expression that I can apply directly to the (split(...)) subexpression to produce in one line the same effect as is achieved by the last two lines of code above?



编辑:明确地说,我试图避免的是 $#ARRAY build 。我知道我总是可以做类似的事情
my @f = do { my @t = split(/\t/, $_, -1); @t[3, 6..$#t] };

最佳答案

列表切片括号中的表达式必须返回零个或多个索引的列表。因此,您必须在生成列表之前知道要切片的列表中的项目数。所以不,它不能使用列表切片来完成。

访问堆栈上列表的最直接方式是通过 @_ .这确实需要一个子调用,但它确实为您提供了一种将列表留在堆栈上的简单机制。

my @f = sub { @_[6..$#_] }->( split(/\t/, $_, -1) );

请注意,此解决方案不会创建数组并将值复制到该数组中,就像您添加到问题中的代码一样。

关于perl - 如何在 Perl 中指定 "tail slice"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14226464/

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