我试图基于现有阵列构建一个新阵列.
#!/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";
Run Code Online (Sandbox Code Playgroud)
测试脚本允许我连接旧数组中的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不是正确的函数,我可以用其他方式从现有数组构建一个部分数组?谢谢.
yst*_*sth 10
要获得一个数组,请使用@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 ];
Run Code Online (Sandbox Code Playgroud)
要仅选择3的索引,即3的倍数:
my @new_array = @names[ grep $_ % 3 == 0, 3..$#names ];
Run Code Online (Sandbox Code Playgroud)
无论何时你想要一个数组以外的东西,无论是所有项目还是某个子集,你都可以使用@而不是$.
您可以从具有@arrayname [列表的数组中选择项目的任何子集],其中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在该列表上运行返回一个包含数字(3,6,9,12,...)的333元素列表,一直到999,然后要求@names[3,6,9,12,...,996,999]返回位于@names数组中这些位置的333个元素.