Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 从哈希结构的键构建数组_Perl - Fatal编程技术网

Perl 从哈希结构的键构建数组

Perl 从哈希结构的键构建数组,perl,Perl,我有下面的子例程OutputineOrderedVectors,它的目标是按照一些预先指定的要求输出向量。但是,代码只输出空白文件 我认为问题应该来自下面的代码段,其中涉及到从chainRollupDoc的第二级散列重新排序密钥 my @rollupArray = sort keys %chainRollupDoc; my @reorderedSS = (); foreach my $i(0 .. $#rollupArray) { foreach my $cu

我有下面的子例程OutputineOrderedVectors,它的目标是按照一些预先指定的要求输出向量。但是,代码只输出空白文件

我认为问题应该来自下面的代码段,其中涉及到从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;
}

我不知道在哪里声明了
%chainRollupDoc
,这让我怀疑您是否将散列引用与实际散列混为一谈。看起来函数是用hashref作为第三个参数调用的,因为您说:

my $chainRollupDoc = shift;
但是下一行使用了名为
%chainRollupDoc
散列。也许你是这个意思

my @rollupArray = sort keys %$chainRollupDoc;

(注意添加到哈希ref的美元符号)。

我不知道在哪里声明了
%chainRollupDoc
,这让我怀疑您是否将哈希ref与实际哈希混淆了。看起来函数是用hashref作为第三个参数调用的,因为您说:

my $chainRollupDoc = shift;
但是下一行使用了名为
%chainRollupDoc
散列。也许你是这个意思

my @rollupArray = sort keys %$chainRollupDoc;

(注意添加到哈希参考的美元符号)。

假设您有:

$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;
}
如果您给我们一个数据示例,以及该数据的预期输出,我们可以进一步帮助您


我想指出,您正在进行编程。

假设您有:

$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;
}
如果您给我们一个数据示例,以及该数据的预期输出,我们可以进一步帮助您


我想指出的是,您正在中编程。

您是否使用
使用strict
使用警告?我用Perl编程才20年,我知道我没有发现它们所存在的所有问题,因此我基本上不会在没有它们的情况下编写Perl。直接使用数组元素,而不是使用索引。例如,不要对我的$i(0..$#数组)使用
而对我的$elem(@array)
使用
,直到您确切知道建议这样做的原因。您是否使用
使用strict
使用警告?我用Perl编程才20年,我知道我没有发现它们所存在的所有问题,因此我基本上不会在没有它们的情况下编写Perl。直接使用数组元素,而不是使用索引。例如,对我的$i(0..$#数组)使用
而不是
对我的$elem(@array)
使用
,直到您确切知道建议这样做的原因。这就是我所称的OutputingOrderedVectors和传递chainRollupDoc OutputingOrderedVectors($centroid,$file1,$chainRollupDoc);这就是我所说的OutputingOrderedVectors和传递chainRollupDoc OutputingOrderedVectors($centroid,$file1,$chainRollupDoc);