加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何在Perl中指定“尾部切片”?

发布时间:2020-12-15 22:05:00 所属栏目:大数据 来源:网络整理
导读:如果我只想提取制表符分隔记录的第4,第5和第7个元素(比如说),我可以这样做: my @f = (split(/t/,$_,-1))[3,4,6]; 但是,如果我想要第4个元素和“尾片”,包括从第7个元素到数组末尾的所有元素,该怎么办?我不知道如何在一行中做到这一点.我能做的最好的就是
如果我只想提取制表符分隔记录的第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构造.我知道我总能做点什么

my @f = do { my @t = split(/t/,-1); @t[3,6..$#t] };

解决方法

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读