2013-10-24 29 views
1

我解析一个文件,每一个奇数行给我一个“字母”(A,B,C等),每一个偶数行给我一个“二进制序列”(0101 ,1111,0001等)。在Perl中创建数组的可扩展哈希

我想创建一个数组散列(但如果您认为另一个数据类型更适合,请让我知道)保持所有行组织。

我知道有阵列可能看起来像:

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

,我知道如何访问此数据类型信息。

但是,我有问题创建这种数据类型。

举例来说,我能够正确地获得“信”为文件($号)和“二进制序列”($ SEQ),使用类似:

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

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

但我不确定如何于:

  1. 创建数组的哈希,
  2. 首先检查是否是“信”已经在哈希
  3. 一键存在,如果“信”不存在,作为一个键,然后浩w将它创建为新密钥
  4. 在确定“字母”已存在或创建它之后,如果不存在,如何将“seq”添加为“字母”的值。

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

任何帮助将不胜感激!

回答

4

要创建散列,只需在代码的开头放置my %HoA;即可。给定一个$letter$seq,您可以通过执行push @{$HoA{$letter}}, $seq;来完成步骤2-4,并且Perl负责处理细节。

3

检查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} }, $_; 
    } 
} 
+0

鉴于OP的原始问题,这是最有用的答案。 – Chris

5

假设你的数据是不变的真理。

#!/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 
+0

我非常感谢您对Data :: Dumper的建议。感谢那。我只是好奇:第6行是什么意思:$/=“\ r \ n”; – LanneR

+1

'$ /'是一个特殊变量,即输入记录分隔符。它控制Perl从文件句柄读取字符串时分割哪些字符串。默认情况下它是'\ n',但我注意到你正在处理回车符,因此将它设置为'\ r \ n'作为替代你的正则表达式替换方法。 'chomp'也会引用'$ /'。 – Chris