【问题标题】:How to apply splice or any other function to several different arrays in Perl?如何将拼接或任何其他函数应用于 Perl 中的几个不同数组?
【发布时间】:2017-10-04 00:08:42
【问题描述】:

我正在尝试缩短以下代码:

    if ( /MATCH/ ){
        splice @identifiers,            $i, 1;
        splice @sequences,              $i, 1;
        splice @optional_informations,  $i, 1;
        splice @quality_scores,         $i, 1;
        splice @barcodes,               $i, 1;
    }

有没有办法遍历每个数组并执行拼接或任何其他功能?

【问题讨论】:

  • 可能,但我认为这可能是一个更广泛的问题 - 你的输入和所需的输出数据结构是什么?因为这在我看来就像一个XY problem
  • 真正的“问题”是他们使用并行数组。
  • 一组并行数组(实际上是一个 HoA)比对象数组 (AoH) 使用的内存更少,但使用起来要困难得多。

标签: arrays perl loops


【解决方案1】:

你可以遍历一个引用数组:

@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;
}

【讨论】:

  • 我今天学习了一些 Perl。我不认为\(@foo, @bar, @baz) 会做它所做的事情。谢谢。
  • 我也不知道。我凭直觉试了一下。我无法解释 \ 的操作数如何不会变成扁平列表。但它 DWIM 太棒了
  • Perl 带有优秀的文档。人们应该每年至少阅读一次从perldoc perltoc 链接的所有内容。请参阅“制作引用”中的perldoc perlref:“引用枚举列表与使用方括号不同——相反,它与创建引用列表相同!”跨度>
  • 我一定对阅读它有很远的记忆,这让我产生了尝试它的想法。我仍然不想尝试理解语法中实际上让括号内的逗号知道他们不应该做他们通常的列表展平事情的语法部分,因为在解析树的下一个节点上有一个反斜杠跨度>
【解决方案2】:

当您发现自己想要对许多相关的数据结构做类似的事情时,这表明它们应该是更大数据结构的成员。在这种情况下,您可以将所有数组放在一个散列中:

my %dataset = (
    identifiers    => [],
    sequences      => [],
    optional_info  => [],
    quality_scores => [],
    barcodes       => [],
);

if ( /MATCH/ ) {
    splice @$_, $i, 1 for values %dataset;
}

事实上,正如@ikegami 在 cmets 中指出的那样,其他数据结构可能更合适,具体取决于您可能执行的操作类型。例如,如果您需要使用变量值的子集选择记录,例如 quality_scores 在 30 到 70 之间,最好将数据存储为哈希数组(如果顺序很重要),或者作为散列的散列(如果顺序无关紧要,或者如果您愿意向数据集添加序数。

例如,

 my %dataset = (
    id0 => {
        t => '...',
        id => '...',
        sequence => '...',
        optional_info => '...',
        quality_score => '...',
        barcoode => '...',
    },
    # ...
    idn => {
        t => '...',
        id => '...',
        sequence => '...',
        optional_info => '...',
        quality_score => '...',
        barcoode => '...',
    },
 );

使用该数据结构,您可以使用其标识符(或索引,如果您键入 t)删除特定记录。

【讨论】:

  • 确实,当您愿意使用这些数组重构其余代码时,这是一个不错的版本。
  • @WumpusQ.Wumbley 它还可以更轻松地处理将附加变量添加到分析中的情况。虽然,我猜@optional_informations 是这类东西的统称,类似于填充逗号分隔数据等的数据库字段。
  • 可能应该是 AoH 而不是 HoA。 [ { identifier => $identifier0, sequence => $sequence0, }, { ... }, ... ]。甚至是 HoH,这样您就可以更轻松地“拼接”。 { $identifier0 => { identifier => $identifier0, sequence => $sequence0, }, $identifier1 => { ... }, ... ]
  • @ikegami 这真的取决于。有一件事是肯定的,它们不应该存储在单独的命名数组中。
  • 是的,使用 HoH 更有意义。非常感谢!
【解决方案3】:

我们可以将数组的引用集中存储在一个数组中,并像下面这样遍历它。

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

}

【讨论】:

  • 这个答案添加了什么其他答案没有捕捉到?
猜你喜欢
  • 2017-02-10
  • 2012-05-13
  • 2018-02-09
  • 2021-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
相关资源
最近更新 更多