2

我有一个包含不同行的文件,每一行都有一个重复的模式。我需要一个合适的数据结构来解析我的文件,例如:

cluster1:gene1(genome1) gene2(genome2) gene3(genome3)
cluster2:gene4(genome4) gene5(genome5)

名字是任意的,可以是任何东西。

我想过一个散列数据结构的散列

  %hoh=("cluster1" => {
        "gene1"=>"genome1"
        "gene2"=>"genome2"
        "gene2"=>"genome2"
                       },   "cluster2" => {
        "gene4"=>"genome4"
        "gene5"=>"genome5"
                       }
       )

我有 2 个问题:首先:如何在每行中查找重复的模式?

其次,我如何制作哈希哈希?

编辑:根据 Zaid 的要求发布

#!/usr/bin/perl -w
use strict; use warnings;
    my %HoH;
while(<DATA>){
    my $line=$_;
    chomp($line);
    my ( $cluster, $genes ) = split (/:/,$line);

     $HoH{ $cluster } = { split/[( )]+/ , $genes };

  }  
foreach $cluster (keys %HoH){
    print "$cluster: ";
    foreach $genes (keys %{$HoH{$cluster}}){
        print "$genes = $HoH{$cluster}{$genes} ";
    }
    print "\n";
}                                               

__DATA__
cluster1:gene1(genome1) gene2(genome2) gene3(genome3)
cluster2:gene4(genome4) gene5(genome5)
4

4 回答 4

5

当 OP 发布他们的尝试时要遵循的解释:

my %HoH;

while (<>) {

    chomp;
    my ( $cluster, $genes ) = split /:/;

    $HoH{ $cluster } = { split /[( )]+/, $genes };
}
于 2012-08-29T17:23:26.567 回答
1

假设模式始终遵循AAA:BBB(CCC) DDD(EEE) FFF(GGG)...,您可以使用以下算法:

  1. 阅读每一行
  2. 拆分:,阅读第一部分作为你的关键
  3. 用空格分割剩余部分,然后使用正则表达式进行解析,例如: ([^(]+)\(([^)])\)
  4. 从正则表达式中捕获的组创建内部哈希
  5. Set $hoh{key from step 2}= 来自第 4 步的哈希

未经测试,但类似于以下内容(哈希引用有点不确定,但你明白了):

while(<>) {
    ($key, $rest) = split ':';
    @genes = split ' ', $rest;
    my %h;
    foreach $gene (@genes) {
        ($k, $v) = split /[\(\)]/, $gene;
        $h{$k} = $v;
    }
    $hoh{$key}=\%h;        
}

不过,可能有一种更优雅的 PERL-y 方式来做到这一点:)

于 2012-08-29T17:18:41.300 回答
0
#!/usr/bin/perl -w
use strict; use warnings;
    my %HoH;
    while(<DATA>){
        my $line=$_;
        chomp($line);
        my ( $cluster, $genes ) = split (/:/,$line);

        $HoH{ $cluster } = { split/[( )]+/ , $genes };

    }  
    foreach my $cluster (keys %HoH){
        print "$cluster: ";
        foreach my $genes (keys %{$HoH{$cluster}}){
            print "$genes = $HoH{$cluster}{$genes} ";
        }
    print "\n";
    }                                               

__数据__

集群1:基因1(基因组1)基因2(基因组2)基因3(基因组3)

簇2:基因4(基因组4)基因5(基因组5)

于 2012-08-30T13:57:08.343 回答
0

假设您不需要担心与预期输入不匹配的行,您可以使用单个split.

while( <DATA> ){
  chomp;
  next unless $_; # skip blank lines

  my($key,%value) = split /[:()\s]+/;
  $data{$key} = \%value;
}
于 2012-08-30T17:55:14.660 回答