在Perl中创建可扩展的数组哈希

时间:2013-10-24 04:45:57

标签: arrays perl hash

我正在解析一个文件,每个奇数行给我一个“字母”(A,B,C等),每个偶数行给我一个“二进制序列”(0101,1111,0001等)。

我想创建一个数组哈希(但是如果你认为另一种数据类型更合适,请告诉我)以保持所有行的组织。

我知道数组的外观可能如下:

%HoA = (
    A  => [ "0001", "1010" ],
    B  => [ "0011", "1111", "0111" ],
    C  => [ "0000"],
);

我知道如何从这种数据类型访问信息。

但是,我在创建此数据类型时遇到了问题。

例如,我能够正确地获取文件的“字母”($ letter)和“二进制序列”($ seq),使用类似的东西:

while (<INPUT>) {
    s/[\n\r]//mg;

    if ( /^>/) {
        $letter = substr($_, 7, 1);
    }
    if ( /^[01]/) {
        $seq = $_;
    }
}

但我不确定如何:

  1. 创建数组的哈希,
  2. 首先检查该“字母”是否已作为哈希
  3. 中的键存在
  4. 如果“letter”不作为键存在,那么如何将其创建为新键
  5. 确定“字母”已存在或创建后如果不存在,如何将“seq”作为值添加到“字母”中。
  6. 如果无法在Perl中创建这样的数据类型,那么我将不胜感激任何关于要转向的数据类型的建议!我需要将每个“字母”保留在其所有“序列”上。

    非常感谢任何帮助!

3 个答案:

答案 0 :(得分:4)

假设您的数据是绝对可靠的。

#!/usr/bin/perl
use strict;
use warnings FATAL => qw/all/;
use Data::Dumper;

$/ = "\r\n";

my %HoA;

while (<DATA>)
{
    my $letter = substr($_, 7, 1);
    chomp(my $seq = <DATA>);

    push @{$HoA{$letter}}, $seq;
}

print Dumper \%HoA;

__DATA__
>      A
0001
>      A
1010
>      B
0011
>      B
1111
>      B
0111
>      C
0000

答案 1 :(得分:3)

要创建哈希,只需将my %HoA;放在代码的开头即可。给定$letter$seq,您只需执行push @{$HoA{$letter}}, $seq;即可立即完成步骤2-4,而Perl会处理详细信息。

答案 2 :(得分:2)

检查perl data structures cookbook

my %HoA;
my $letter;
while (<INPUT>) {
    s/[\n\r]//g;

    if ( /^>/) {
        $letter = substr($_, 7, 1);
    }
    if ( /^[01]/) {
        #  $seq = $_;
        push @{ $HoA{$letter} }, $_;
    }
}