如何基于现有数组的一部分形成新数组

时间:2013-04-19 20:27:18

标签: perl

我正在尝试基于现有阵列构建新阵列。

#!/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不是正确的函数,我可以用其他方式从现有数组构建部分数组?谢谢。

2 个答案:

答案 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个元素。