2012-01-01 56 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

您是否使用'嚴格使用';'使用警告;'?我只用了大約20年的Perl編程,並且我知道我沒有發現他們所做的所有問題,所以我從來沒有在沒有Perl的情況下編寫Perl。 – 2012-01-01 20:35:54

+1

直接使用數組元素而不是使用索引。例如。而不是'爲我的$ i(0 .. $#數組)'使用'我的$ elem(@array)' – TLP 2012-01-01 20:41:16

+1

['use strict'](http://perldoc.perl.org/strict.html) ['使用警告'](http://perldoc.perl.org/warnings.html),直到你確切知道爲什麼建議這麼做。 – 2012-01-01 20:42:47

回答

3

我沒有看到%chainRollupDoc是在哪裏聲明的,這讓我想知道你是否將哈希引用與實際哈希混合在一起。它看起來像函數被用hashref作爲第三個參數,因爲你說叫:

my $chainRollupDoc = shift; 

但隨後的下一行使用哈希稱爲%chainRollupDoc。也許你的意思是?

my @rollupArray = sort keys %$chainRollupDoc; 

(注意美元符號添加到deref hashref)。

+0

這就是我所說的OutputingReorderedVectors並傳遞chainRollupDoc OutputingReorderedVectors($ centroid,$ file1,$ chainRollupDoc); – user785099 2012-01-01 21:16:06

0

假設,你必須:

$features{$cui} = 1; 

您的意思是:

$attributes{$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; 
} 

如果你給我們的一個例子您數據以及該數據的預期輸出,我們可以爲您提供更多幫助。

我想指出,你正在編程Perl as if it were C