построить массив из ключей хеш-структуры - PullRequest
0 голосов
/ 02 января 2012

У меня есть следующая подпрограмма 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 ]

3 голосов
/ 02 января 2012

Я не вижу, где объявлено %chainRollupDoc, и это заставляет меня задуматься, смешиваете ли вы хеш-ссылку с реальным хешем.Похоже, что функция вызывается с хеш-значением в качестве третьего аргумента, поскольку вы говорите:

my $chainRollupDoc = shift;

, но в следующей строке используется хеш с именем %chainRollupDoc.Может быть, вы имели в виду это?

my @rollupArray = sort keys %$chainRollupDoc;

(обратите внимание на знак доллара, добавленный к разыменованию хэш-ссылки).

0 голосов
/ 02 января 2012

Предположим, где у вас есть:

$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, как если бы это был C .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...