2017-12-31 98 views
0

配列が2つのリストと一致していれば、それは異なる列の行のリストです(この場合は3列の値を使用します)。 "):配列をハッシュに変換して必要なカラムを抽出する

私が試してみました:

my %row; 
@row{@match_all} = split "\t"; 

foreach (@match_all){ 
     my %row; 
     @row{@sample_names} = split "\t"; 
     my @filter= join "\t", @row{@wanted}; 
      push (@wanted_columns, @filter); # 



$VAR1 = { 
'#Genera' => 'namex', 
'sample1' => '0.0024', 
'sample2' => '0.0013', 
'sample3' => '0.0' 
}; 
+2

最初のコードブロックが有効なコードではありません。 '@ match_all'に何が含まれているか教えてください。 – ikegami

答えて

-1
use strict; 
use warnings qw(all); 
use feature qw(say); 

sub get_row { 
    my ($fh) = @_; 
    my $line = <$fh>; 
    return undef if !defined($line); 

    chomp($line); 
    return [ split(/\t/, $line, -1) ]; 
} 

sub get_row_hr { 
    my ($fh, $headers) = @_; 
    my $line = <$fh>; 
    return undef if !defined($line); 

    chomp($line); 
    my %row; 
    @row{@$headers} = split(/\t/, $line, -1); 
    return \%row; 
} 

{ 
    my @wanted_cols = ('#Genera', 'sample1', 'sample3'); 

    my $fh = \*DATA; 

    my $headers = get_row($fh) 
     or die("Premature EOF\n"); 

    say join "\t", @wanted_cols; 
    while (my $row = get_row_hr($fh, $headers)) { 
     say join "\t", @$row{@wanted_cols}; 
    } 
} 

__DATA__ 
#Genera sample1 sample2 sample3 
Gordonia 0.3 0.1 0.4 
Mycobacterium 0.0032 0.23 0.0 
Ornithinimicrobium 0.06 0.0 0.0 
Pseudomonas 0.3 0.28 0.52 
Halomonas 0.0006 0.1 0.1 
Acinetobacter 0.9 0.02 0.5 
Bacillus 0.4 0.5 0.1 
Klebsiella 0.22 0.4 0.3 
Lactobacillus 0.4 0.0 0.0 
+1

コードブロックで説明を投稿してください。生コードダンプは、一般的に将来の視聴者には役に立たない。 –

+0

@Silvio Mayolo、私は自明のコードを書いた。私は自分自身を繰り返さずに何ができるのか分からない。ここには魔法の鍵はありません。単なる一連の単純なステートメントです。あなたが具体的に何か具体的に思っていると思うなら、具体的に何を指定してください。それまでは、あなたが私の答えであると非難する限り、コメントは役に立たない。 – ikegami

+1

@SilvioMayolo「_Rawコードのダンプは一般的に役に立たない」_私は二重に反対します。(1)正しいコードとよく書かれたコードは、何か仕事をする意思がある人にとって役立つものでなければなりません。実際、それは最初に役立つものです。説明はきれいで素敵ですが、良いコードは王です。 (2)これは "_rawコードダンプ" _ではなく、よく書かれた明確なプログラムです。それは、どの言語の基本機能にも依存していることに注意してください。それはまた質問のあいまいさに特に適しています。 – zdim

関連する問題