2012-01-01 21 views
0

私は以下のサブルーチンOutputingReorderedVectorsを用意しています。ただし、コードは空白のファイルを出力するだけです。ハッシュ構造のキーから配列を構築する

は私はこの問題は、再注文chainRollupDocの第二レベルのハッシュからキーを含む、この次のコード・セグメントから来るべきだと思う

my @rollupArray = sort keys %chainRollupDoc; 
    my @reorderedSS =(); 
    foreach my $i(0 .. $#rollupArray) 
    { 
     foreach my $cui (sort keys %{$chainRollupDoc->{$rollupArray[$i]}}) 
      { 
      push @reorderedSS, $cui; 
      } 
    } 

全体サブルーチンは、次

##################################### 
sub OutputingReorderedVectors 
##################################### 
{ 
    my $centroids = shift; 
    my $fileName = shift; 
    my $chainRollupDoc = shift; 
    my @rollupArray = sort keys %chainRollupDoc; 
    my @reorderedSS =(); 
    foreach my $i(0 .. $#rollupArray) 
    { 
    foreach my $cui (sort keys %{$chainRollupDoc->{$rollupArray[$i]}}) 
    { 
     push @reorderedSS, $cui; 
    } 
    } 

    my %attributes =(); 
    foreach my $category (keys %$centroids) 
    { 
    foreach my $cui (keys %{$centroids->{$category}}) 
    { 
     $features{$cui} = 1; 
    } 
    } 
    my @fullSpace = sort keys %attributes; 
    open(OUTPUT, "> $fileName"); 

    foreach my $i(0 .. $#reorderedSS) 
    { 
    printf OUTPUT "\t%s", $reorderedSS[$i]; 
    } 
    print OUTPUT "\n"; 
    foreach my $i (0 .. $#fullSpace) 
    { 
    printf OUTPUT "%s", $fullSpace[$i]; 
    foreach my $j (0 .. $#reorderedSS) 
    { 
     printf OUTPUT "\t%f", $centroids->{$reorderedSS[$j]}->{$fullSpace[$i]}; 
    } 
    print OUTPUT "\n"; 
    } 
    close OUTPUT; 
} 
であります
+2

あなたは 'use strict;'と 'use warnings;'を使っていますか?私はPerlで約20年しかプログラミングをしていませんでした。私は彼らがしているすべての問題を見つけることはできないことを知っています。 –

+1

インデックスを使用する代わりに、配列要素を直接使用します。例えば。 for my $ i(0 .. $#array)の代わりに 'my $ elem(@array)'のために ' – TLP

+1

[' use strict'](http://perldoc.perl.org/strict.html)と 'なぜそれが推奨されるのか正確に分かるまで、['警告を使用する](http://perldoc.perl.org/warnings.html) –

答えて

3

%chainRollupDocがどこに宣言されているかわからないので、実際のハッシュとハッシュ・リファレンスを混在させているのだろうかと思います。

my $chainRollupDoc = shift; 

が、次の行が、その後%chainRollupDoc呼ばハッシュを使用しています:関数は、あなたが言うので、第三引数としてハッシュリファレンスで呼び出されるように見えます。多分あなたはこれを意味しましたか?

my @rollupArray = sort keys %$chainRollupDoc; 

(ハーフリファレンスを参照するためにドル記号が追加されています)。

$features{$cui} = 1; 

あなたは意味:あなたは私達にあなたの例を与えた場合

use warnings; use strict; 
use List::MoreUtils qw'uniq'; 
use autodie; 

sub OutputingReorderedVectors{ 
    my($centroids,$fileName,$chainRollupDoc) = @_; 

    my @reorderedSS; 
    for my $i(sort keys %$chainRollupDoc){ 
    push @reorderedSS, sort keys %{$chainRollupDoc->{$i}} 
    } 
    # NOTE: @reorderedSS is NOT sorted, only parts of it are. 

    my @fullSpace; 
    for my $category (values %$centroids){ 
    push @fullSpace, keys %$category 
    } 
    @fullSpace = sort uniq @fullSpace; 

    open my $output, '>', $fileName; 

    print {$output} join("\t", '', @reorderedSS), "\n"; 

    for my $i (@fullSpace){ 
    print {$output} $i; 
    for my $j (@reorderedSS){ 
     # could possibly be replaced with a simple print statement 
     printf {$output} "\t%f", $centroids->{$j}->{$i}; 
    } 
    print {$output} "\n"; 
    } 
    close $output; 
} 

$attributes{$cui} = 1; 

これはあなたのコードの簡易版であるあなたが持っているところと仮定

+0

これは私がOutputingReorderedVectorsと呼んで、chainRollupDocを渡すものです。 OutputingReorderedVectors($ centroid、$ file1、$ chainRollupDoc); – user785099

0

データ、およびそのデータの予想される出力があれば、さらに手伝うことができます。

Perl as if it were Cでプログラミングしていることを指摘したいと思います。