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