2016-10-08 13 views
-1

私のコードは致命的なエラーを発生させずに実行されますが、出力は明らかに誤りです。私は最初に配列のハッシュを作成します。次に、ファイル内のシーケンスをハッシュのキーと照らし合わせて検索します。シーケンスがハッシュのキーとして存在する場合は、キーと関連する値を出力します。これは十分に簡単でなければならず、配列のハッシュを正しく作成しています。しかし、関連する値を出力すると、その場所に "ARRAY(0x7ff4bbb0c7b8)"という文字が表示されます。ARRAY(0x7ff4bbb0c7b8)エラー:配列のperlハッシュ

ファイル "INFILEは" タブ区切りのであり、例えば、次のようになります。ここでは

AAAAA  AAAAA 
BBBBB  BBBBB  BBBBB 

は私のコードです:

>AAAAA 
ARRAY(0x7fc52a805ce8) 
>AAAAA 
ARRAY(0x7fc52a805ce8) 

use strict; 
use warnings; 

open(INFILE, '<', '/path/to/file') or die $!; 
my $count = 0; 

my %hash = ( 
    AAAAA => [ "QWERT", "YUIOP" ], 
    BBBBB => [ "ASDFG", "HJKL", "ZXCVB" ], 
); 

while (my $line = <INFILE>){ 
    chomp $line; 
    my $hash; 
    my @elements = split "\t", $line; 
    my $number = grep exists $hash{$_}, @elements; 
    open my $out, '>', "/path/out/Cluster__Number$._$number.txt" or die $!; 
    foreach my $sequence(@elements){ 
     if (exists ($hash{$sequence})){ 
      print $out ">$sequence\n$hash{$sequence}\n"; 
     } 
     else 
     { 
      $count++; 
      print "Key Doesn't Exist ", $count, "\n"; 
     } 
    } 
} 

電流出力は次のようになります

期待される出力は次のようになります:

>AAAAA 
QWERT 
>AAAAA 
YUIOP 

ありがとうございました。この行に

+0

'@ {$ハッシュ{$シーケンス}} ' – melpomene

答えて

1

ここで重要なのは、ただではなく、ハッシュで開催された配列リファレンスを持つ作品ですそれを印刷しようとしています。何があっても、配列から最初の項目を削除したい場合は、shift関数でこれを行うことができます。次に、配列の末尾にある項目をpushにするか、すべてのキーが一度使用されたときに何が起きるかに応じて項目がなくなると、deleteハッシュのキーを入力することができます。また、このようなrand機能を持つ配列からランダムな要素を選択できます

my $out_seq = $hash{$sequence}[rand [email protected]{ $hash{$sequence} }]; 

あなたはアイテムがランダムな場合には不足したい場合、あなたは、配列から項目を削除する必要があります。それを行うための最善の方法は、splice(ジェネリックshiftの形、unshiftpop、およびpush)と、おそらく次のとおりです。ここで

my $out_seq = splice @{ $hash{$sequence} }, rand @{ $hash{$sequence} }, 1; 
delete $hash{$sequence} unless @{ $hash{$sequence} }; 

は、あなたのプログラムの私のバージョンです:

#!/usr/bin/perl 

use strict; 
use warnings; 

use strict; 
use warnings; 

# open my $in, '<', '/path/to/file') or die $!; 
my $in = \*DATA; #use internal data file instead for testing 
my $count = 0; 

my %hash = (
    AAAAA => [ "QWERT", "YUIOP" ], 
    BBBBB => [ "ASDFG", "HJKL", "ZXCVB" ], 
); 

while (<$in>) { 
    chomp; 
    my $hash; 
    my @elements = split "\t"; 
    my $number = grep exists $hash{$_}, @elements; 
    #open my $out, '>', "/path/out/Cluster__Number$._$number.txt" or die $!; 
    my $out = \*STDOUT; # likewise use STDOUT for testing 
    for my $sequence (@elements) { 
     if (exists $hash{$sequence}) { 
      my $out_seq = shift @{ $hash{$sequence} }; 
      # if you want to repeat 
      push @{ $hash{$sequence} }, $out_seq; 
      # if you want to remove $sequence when they run out 
      # delete $hash{$sequence} unless @{ $hash{$sequence} }; 

      print $out ">$sequence\n$out_seq\n"; 
     } else { 
      warn "Key [$sequence] Doesn't Exist ", ++$count, "\n"; 
     } 
    } 
} 

__DATA__ 
AAAAA AAAAA 
CCCCC 
BBBBB BBBBB BBBBB 
+0

おかげでチャス。オーウェンス。いい答え。 – Rob

2

print $out ">$sequence\n$hash{$sequence}\n"; 

... $hash{$sequence}は配列への参照です。参照配列を印刷する前に逆参照する必要があります。ここの要素はカンマで区切られて、次の行に$hash{$sequence}配列の要素を印刷し、$sequenceを印刷する例を示します。

print $out ">$sequence\n"; 
print $out join ', ', @{ $hash{$sequence} }; 
関連する問題