4

我是 Perl 的新手,但我需要它从一些糟糕的 HTML 文件中获取一些文本。在到目前为止的代码中,我已经提取了我需要的所有值(我验证它可以与数据转储器一起使用):

对于每个数据记录,即二维表的行,它们被称为:

$org, $gene_name, $number, $motif_num, $pos, $strand, $seq

我有很多数据条目,每一个都是一行,上面的值作为列。

以后要对它们做其他事情,我想制作一个二维数组结构,这样我就可以遍历每个条目(行)并挑选出我需要的值等等。

我认为这样做的最佳方法是使用循环,并且对于每个数据条目,在使用正则表达式匹配提取值之后,将值/列组合到单个数据记录的数组中:

my @seidl_array_row = ($org, $gene_name, $number, $motif_num, $pos, $strand, $seq);

然后将此数组推送到完成的二维数组数组上:

push @seidl_array, [ @seidl_array_row ];

(@seidl_arraymy在循环之前定义。)

所以实际上我得到了一个二维数据表,其中数组@seidl_array 的每个元素都是一个包含值$org、$gene_name、$number、$motif_num、$pos、$strand 和$seq 的数组。

我是 Perl 的新手,所以我不知道这是否是以编程方式执行此操作的正确方法,因为我在稍后处理这些数据时遇到了问题。我想知道问题是否在于我最初是如何构造数组的。我书中的示例使用简单的数据集静态执行,这是一个更大的基因组数据 gtf 文件,因此静态执行并不可行。

4

2 回答 2

7

据我所知,您的方法没有任何问题。正如 choroba 所建议的那样,使用对数组的引用而不是复制数组的好处是不会不必要地复制数据(但请记住:只有在循环声明 @seidl_array_row 时才有效,否则您只需进行多次引用到同一个数组)。

您可以通过完全跳过行数组来获得同样的优势,如下所示:

push @seidl_array, [ $org, $gene_name, $number, $motif_num, $pos, $strand, $seq ];

为了更方便地访问数据,我经常使用哈希数组,如下所示:

push @seidl_array, {
    org    => $org,
    name   => $gene_name,
    number => $number,
    motif  => $motif_num,
    pos    => $pos,
    strand => $strand,
    seq    => $seq,
};

这样做的好处是您不必记住数组中各个值的位置,而是可以通过名称访问它们。

于 2013-04-15T12:36:05.693 回答
4

您的解决方案对我来说似乎是正确的。使用[ @seidl_array_row ]创建列表的副本,如果您my在循环内正确声明了行,则可以直接存储其引用以避免不必要的复制:

push @seidl_array, \@seidl_array_row;
于 2013-04-15T12:28:34.290 回答