Относительно получения размера массива в хэше структуры массива - PullRequest
0 голосов
/ 16 февраля 2012

Я написал следующую функцию Perl

  sub Outputing
  { 
     my $featureMatrix = shift;
     my $indexRow = shift;
     my $fileName = "/projectworkspace/input.dat";

     open(DATA, "> $fileName");
     printf DATA "%d", $#$indexRow;
     print DATA "\n";

     my $numDataPoints = $#{$featureMatrix{$indexRow->[1]}};
     printf DATA "%d", $numDataPoints;
     print DATA "\n";

     close DATA;    
    }

Я вызывал Outputing следующим образом:

Outputing($matrix, $Rows);e

$ matrix - это хеш массива, структура которого выглядит следующим образом

   my $matrix 
     = { 200 => [ 0.023, 0.035, 0.026 ], 
          110 => [ 0.012, 0.020, 0,033], 
        }; 

Rows - это массив, хранящий отсортированный ключ матрицы, он получается следующим образом:

my @Rows = sort keys %matrix;

и матрица, и строки используются в качестве параметров, передаваемых в Outputing.

Распечатанный $ numDataPoints равен -1, что не правильно?Я не знаю, что может быть причиной, которая вызывает эту проблему?Если мы воспользуемся приведенным выше примером и предположим, что $ indexRow -> [1] = 110, тогда $ numDataPoints должен быть равен 2. Я не уверен, является ли $#{$featureMatrix{$indexRow->[1]}}; правильным способом получения размера этого массива.

1 Ответ

3 голосов
/ 16 февраля 2012

Предполагая, что вы включили весь соответствующий код, это:

my @indexRow = sort keys %featureMatrix;

должно быть таким:

my @indexRow = sort keys %$featureMatrix;

и это:

     my $numDataPoints = $#{$featureMatrix{$indexRow->[1]}};

должно быть так:

     my $numDataPoints = $#{$featureMatrix->{$indexRow->[1]}};

То есть проблема в том, что в некоторых местах вы используете хеш с именем %featureMatrix, а в других вы используете хэш-ссылку с именем $featureMatrix, котораяотносится к анонимному хешу.

Вы должны использовать use warnings и use strict для предотвращения таких ошибок: они не позволили бы вам использовать %featureMatrix, когда вы только объявили $featureMatrix.(На самом деле, use warnings может не помочь в этом случае - он может обнаружить, если вы использовали %featureMatrix точно один раз, но в вашем случае вы используете его несколько раз - но use strict почти наверняка помогло бы.)

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