我想将第二个索引存储到使用范围运算符进行拆分的最后一个索引的第五个元素。
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
答案 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
中的最后一个索引,它使范围计算有效。