我正在尝试基于现有阵列构建新阵列。
#!/usr/bin/perl
#join
use warnings;
use strict;
my @names = ('jacob', 'michael', 'joshua', 'mathew');
my @t_names = join ("\t" , @names);
my @t_names2 = join ("\t", $names[0],$names[2]);
print @t_names, "\n";
print @t_names2, "\n";
测试脚本允许我连接旧数组中的2个元素以形成新数组。但是如果我的数组有1000个元素并且我想形成一个只包含1000个元素的选择部分的新数组(例如,元素3和3的倍数)。我尝试join ("\t", $names[0,2])
,但perl无法识别$names[0,2]
(输出表明$names[0,2]
被“识别”为$names[2]
。并且不确定此错误的含义是什么“{{1} }“
如果multidimensional syntax not supported at join.pl
不是正确的函数,我可以用其他方式从现有数组构建部分数组?谢谢。
答案 0 :(得分:9)
要获得数组的切片,请使用@names[0,2]
,而不是$names[0,2]
。
要获得错误消息的解释,use diagnostics;
,其中包含:
...
不支持多维语法$ names [0,2](W语法)多维数组不像$ foo [1,2,3]那样编写。 它们的写作类似于$ foo [1] [2] [3],就像在C中一样。
这是perl注意到你做错了什么但是你想要做的事情是错的:)
join创建一个字符串,而不是列表,所以大概你只想:
my @new_array = @names[ @indexes_to_select ];
仅选择3的倍数为3的索引:
my @new_array = @names[ grep $_ % 3 == 0, 3..$#names ];
答案 1 :(得分:9)
每当您想要一个数组以外的多个内容时,无论是所有项目还是某个子集,您都使用@
而不是$
。
您可以使用@
arrayname [
列表 ]
从数组中选择项目的任何子集,其中 list 是索引列表。您可以放置以逗号分隔的索引值的文字列表,但也可以放置任何返回列表的表达式。 ysth的解决方案使用表达式grep $_ % 3 == 0, 3..$#names
。打破它,使用这些元素:
$#names
获取@names
..
,用于生成从3到该值的所有数字的列表grep
仅从符号条件$_ % 3 == 0
,表示“当数字除以3时的余数为0”,当然只对3的倍数为真因此,如果数组有1000个元素,那么$#names
是999,3..$#names
是包含数字的997元素列表(3,4,5,6,7,8,... 。)一直到999.在该列表上运行grep $_ % 3 == 0
返回一个包含数字(3,6,9,12,...)的333元素列表,一直到999,然后询问for @names[3,6,9,12,...,996,999]
返回位于@names
数组中那些位置的333个元素。