1

我正在解析一个文件,每一个奇数行给我一个“字母”(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. 在确定“字母”已经存在或者如果不存在则创建它之后,如何将“seq”作为值添加到“字母”中。

如果不能在 Perl 中创建这样的数据类型,那么我将不胜感激任何关于转向哪种数据类型的建议!我需要将每个“字母”附加到它的所有“序列”上。

任何帮助将非常感激!

4

3 回答 3

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
于 2013-10-24T05:23:09.913 回答
3

要创建哈希,只需将其放在my %HoA;代码的开头即可。给定一个$letterand $seq,你可以通过做 一次完成第 2-4 步push @{$HoA{$letter}}, $seq;,Perl 会处理这些细节。

于 2013-10-24T04:50:11.473 回答
2

检查perl 数据结构说明书

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

    if ( /^>/) {
        $letter = substr($_, 7, 1);
    }
    if ( /^[01]/) {
        #  $seq = $_;
        push @{ $HoA{$letter} }, $_;
    }
}
于 2013-10-24T05:18:36.927 回答