关于在数组结构的散列中获取数组的大小

时间:2012-02-16 03:15:30

标签: perl

我写了以下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($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;

矩阵和行都用作传递给输出的参数。

打印出来的$ numDataPoints是-1,这是不正确的?我不知道导致这个问题的原因可能是哪个?如果我们使用上面的例子,并假设$ indexRow-> [1] = 110,那么$ numDataPoints应该是2.我不确定$#{$featureMatrix{$indexRow->[1]}};是否是获得此数组大小的正确方法。

1 个答案:

答案 0 :(得分:3)

假设您已包含所有相关代码,请执行以下操作:

my @indexRow = sort keys %featureMatrix;

应该是这样的:

my @indexRow = sort keys %$featureMatrix;

和此:

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

应该是这样的:

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

也就是说,问题在于,在某些地方,您使用的是名为%featureMatrix的哈希,而在其他地方,您使用的是名为$featureMatrix的哈希引用,它引用了匿名哈希。

您应该使用use warningsuse strict来防止此类错误:当您只声明%featureMatrix时,这些错误会阻止您使用$featureMatrix。 (实际上,use warnings在这种情况下可能没有帮助 - 它可以检测您是否只使用了%featureMatrix一次,但在您的情况下,您使用了几次 - 但use strict几乎可以肯定有帮助。)