首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哈希哈希

哈希哈希
EN

Stack Overflow用户
提问于 2012-08-29 17:10:17
回答 4查看 128关注 0票数 2

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

代码语言:javascript
复制
cluster1:gene1(genome1) gene2(genome2) gene3(genome3)
cluster2:gene4(genome4) gene5(genome5)

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

我想过哈希数据结构的散列

代码语言:javascript
复制
  %hoh=("cluster1" => {
        "gene1"=>"genome1"
        "gene2"=>"genome2"
        "gene2"=>"genome2"
                       },   "cluster2" => {
        "gene4"=>"genome4"
        "gene5"=>"genome5"
                       }
       )

我有两个问题:第一:如何在每一行中寻找重复模式?

第二,我如何做哈希的哈希?

编辑:应Zaid的要求张贴

代码语言:javascript
复制
#!/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)
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-29 17:23:26

在OP发布其尝试时应遵循的解释:

代码语言:javascript
复制
my %HoH;

while (<>) {

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

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

Stack Overflow用户

发布于 2012-08-29 17:18:41

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

  1. 读每一行
  2. :上拆分,将第一部分作为您的密钥
  3. 将剩余部分按空格拆分,然后使用regex解析,类似于:([^(]+)\(([^)])\)
  4. 从regex中捕获的组创建内部散列。
  5. 设置$hoh{key from step 2} =步骤4中的散列

未经测试,但如下所示(散列引用的内容有点不确定,但您可以理解):

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

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-30 13:57:08

代码语言:javascript
复制
#!/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";
    }                                               

__DATA__

簇1:Gene1(Genome1) gene2(genome2) gene3(genome3)

簇2:Gene4(Genome4) gene5(genome5)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12183124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档