2013-10-24 30 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