该解决方案不提前知道基因的名称。它将为所有看到的基因创建列。而且,它使用散列的散列。我解决了一个类似的问题,并且能够在此处使用解决方案的某些相同部分。
#!/usr/bin/perl
use strict;
use warnings;
my @array = map [split], split /\n/, <<EOF;
clusterA gene1 1
clusterA gene2 0
clusterB gene1 1
clusterB gene2 0
clusterC gene3 9
EOF
my %data;
for my $aref (@array) {
$data{$aref->[0]}{$aref->[1]} = $aref->[2];
}
my %seen;
my @genes = sort
grep ! $seen{$_}++,
map keys %$_, values %data;
my $format = "%-15s" . "%-10s" x @genes . "\n";
printf $format, 'Cluster', @genes;
for my $name (sort keys %data) {
my $href = $data{$name};
printf $format, $name, map defined $_ ? $_ : 'none', @$href{ @genes };
}
这产生了下面的输出。
Cluster gene1 gene2 gene3
clusterA 1 0 none
clusterB 1 0 none
clusterC none none 9
更新:首先创建哈希散列而不是数组数组可能更容易。喜欢:
my %data;
$data{$cluster}{$genes} = condition ? 1 : 0;