处理具有正负范围的范围操作符?

时间:2016-08-22 04:33:22

标签: arrays perl

我想将第二个索引存储到使用范围运算符进行拆分的最后一个索引的第五个元素。

my $s = "a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v"; 
my @ar = (split "-",$s)[2..-5]; 
print @ar;   

预期输出为c-d-e-f-g-f-e-c-a-v

如下所示,我想存储

a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v
    |                 |          
    2                 |
                      -5
     __________________
  How to store these element        

2 个答案:

答案 0 :(得分:3)

最简单的方法是将它放在一个数组中,然后将其切片:

my $s = 'a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v'; 
my @arr1 = split /-/, $s;
my @arr2 = @arr1[2..@arr1-5];

my @arr = do { my @arr = split /-/, $s; @arr[2..@arr-5] };

my @arr = map @$_[2..$#$_-5], [ split /-/, $s ];

要在没有额外变量的情况下立即执行所有操作,您需要选择比数组更大的任意大小并执行两个切片:

my @arr = grep defined, (grep defined, (split /-/, $s)[2..999])[-999..-5];

(效率远低于仅使用单独的数组)。

说明:假设$ s为'a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v'

第一个切片(2..999)将生成一个'c', 'd', 'e', ..., 't', 'a', 'v'列表,后跟984个undef值,因为切片会询问那些不存在的元素。内部grep defined删除了undef个值,将14个元素c保留到v列表。

第二个切片(-999 ..- 5)生成一个以985 undef个元素开头的列表(因为索引-999到-15不存在),后跟'c', 'd', 'e', ..., 'c', 'a', 'v'。外部grep defined删除了那些undef值,留下了所需的10个元素列表。

答案 1 :(得分:1)

你不能直接这样做。 2..-5是一个空列表,因为2大于-5

您必须使用数组:

my $s = "a-b-c-d-e-f-g-f-e-c-a-v-a-t-a-v"; 
my @ar = split /-/, $s;
print join("-", @ar[2 .. $#ar-4]), "\n";

$#ar@ar中的最后一个索引,它使范围计算有效。