2012-01-01 2 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 년 동안 만 프로그래밍을 해왔으며, 나는 그들이하는 모든 문제점을 발견하지 못한다는 것을 알고 있으므로 필자는 본질적으로 Perl을 사용하지 않고 Perl을 코딩하지 않는다. –

+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를 사용하는 기능은 당신이 말하는 이후 세 번째 인수로 hashref으로 호출되는 것 같습니다. 아마 이걸 의미했을거야?

my @rollupArray = sort keys %$chainRollupDoc; 

(해시 참조에 추가 된 달러 기호에 유의하십시오.) 당신이

+0

이것은 내가 OutputingReorderedVectors를 호출하고 chainRollupDoc을 전달하는 것입니다. OutputingReorderedVectors ($ centroid, $ file1, $ chainRollupDoc); – user785099

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에 프로그래밍 중임을 알려드립니다.