我正在尝试缩短以下代码:
if ( /MATCH/ ){
splice @identifiers, $i, 1;
splice @sequences, $i, 1;
splice @optional_informations, $i, 1;
splice @quality_scores, $i, 1;
splice @barcodes, $i, 1;
}
有没有办法迭代每个数组并执行拼接或任何其他功能?
答案 0 :(得分:9)
您可以迭代一系列引用:
@all_arrays = \( # Note the ref-making backslash applied to the list
@identifiers,
@sequences,
@optional_informations,
@quality_scores,
@barcodes
);
for $array (@all_arrays)
{
splice @$array, $i, 1;
}
答案 1 :(得分:8)
当您发现自己想要对许多相关数据结构执行类似操作时,这表明它们应该是更大数据结构的成员。在这种情况下,您可以将所有数组放在哈希中:
my %dataset = (
identifiers => [],
sequences => [],
optional_info => [],
quality_scores => [],
barcodes => [],
);
if ( /MATCH/ ) {
splice @$_, $i, 1 for values %dataset;
}
事实上,正如@ikegami在评论中指出的那样,其他数据结构可能更合适,具体取决于您可能执行的操作类型。例如,如果您需要使用变量值的一个子集来选择记录,比如30到70之间的quality_scores
,那么最好将数据存储为哈希数组(如果顺序很重要) ,或作为哈希的散列(如果顺序无关紧要,或者您是否愿意在数据集中添加序数。
例如,
my %dataset = (
id0 => {
t => '...',
id => '...',
sequence => '...',
optional_info => '...',
quality_score => '...',
barcoode => '...',
},
# ...
idn => {
t => '...',
id => '...',
sequence => '...',
optional_info => '...',
quality_score => '...',
barcoode => '...',
},
);
使用该数据结构,您可以使用其标识符(或键入t
时的索引)删除特定记录。
答案 2 :(得分:0)
我们可以在一个数组中集中存储数组的引用,并按如下方式迭代它。
foreach my $arr_ref (\(@identifiers,@sequences,@optional_informations,@quality_scores)){
my @tmparr=@{ $arr_ref }[3,4];#slice operation or any other operation can be performed
}