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

予想される入力と一致しない行について心配する必要がないと仮定すると、単一のsplit.

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

  my($key,%value) = split /[:()\s]+/;
  $data{$key} = \%value;
}
于 2012-08-30T17:55:14.660 に答える
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)

cluster2:gene4(ゲノム4) 遺伝子5(ゲノム5)

于 2012-08-30T13:57:08.343 に答える