7

我试图基于现有数组构建一个新数组。

#!/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]。并且不确定这个错误是什么意思“ multidimensional syntax not supported at join.pl

如果join不是正确的函数,我可以通过什么其他方式从现有数组构建部分数组?谢谢你。

4

2 回答 2

11

要获取数组的一部分,请使用@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 ];
于 2013-04-19T20:29:17.347 回答
10

每当您想从数组中取出多个东西时,无论是所有项目还是某个子集,您都可以@使用$.

@您可以使用arrayname [list从数组中选择任何项目子集],其中list是索引列表。您可以放置​​以逗号分隔的索引值的文字列表,但您也可以放置任何返回列表的表达式。ysth 的解决方案使用表达式grep $_ % 3 == 0, 3..$#names。分解它,使用这些元素:

  • $#names获取最后一个元素的索引@names
  • 范围构造..,用于生成从 3 到该值的所有数字的列表
  • grep从该数字列表中仅提取与条件匹配的数字
  • 该条件是表达式$_ % 3 == 0,这意味着“数字除以 3 时的余数为 0”,当然这仅适用于 3 的倍数

因此,如果数组有 1000 个元素,$#names则为 999,并且3..$#names是一个包含数字 (3,4,5,6,7,8,...) 的 997 元素列表,一直到 999。grep $_ % 3 == 0在该列表上运行返回一个包含 333 个元素的列表,其中包含数字 (3,6,9,12,...) 一直到 999,然后请求@names[3,6,9,12,...,996,999]返回位于@names数组中这些位置的 333 个元素。

于 2013-04-19T20:58:04.227 回答