我有以下数据结构:
my %hash = (
'hsa_circ_0024017|chr11:93463035-93463135+|NM_033395|KIAA1731 FORWARD' => [
{
'energy' => '-4.3',
'spacer' => 'AGGCACC',
'end' => '97',
'start' => '81'
}
],
'hsa_circ_0067224|chr3:128345575-128345675-|NM_002950|RPN1 FORWARD' => [
{
'energy' => '-4.4',
'spacer' => 'CAGT',
'end' => '17',
'start' => '6'
},
{
'energy' => '-4.1',
'spacer' => 'GTT',
'end' => '51',
'start' => '26'
},
{
'energy' => '-4.1',
'spacer' => 'TTG',
'end' => '53',
'start' => '28'
}
],
...
);
如何访问哈希的内容以便能够比较循环中的内容?
对于每个父哈希(hsa_circ ...),我想将子哈希(间隔符)一起比较。请原谅我,我正在努力说出这一点。这当然是一小部分数据样本。简而言之,我的目标是检测具有相同间隔的哈希阵列,如果它们具有相同的间隔,那么我想选择具有最低能量分数的哈希数组。
答案 0 :(得分:1)
问题:每个arrayref中可能存在具有相等 spacer 值的hashref组。在每个这样的组中,具有最低 energy 值的hashref 需要确定,以取代该群体。
大多数工作都在namespace JoeyD473\RPG_Tools\controllers\traveller;
use JoeyD473\RPG_Tools\controllers\BaseController;
use JoeyD473\RPG_Tools\models\traveller\universe\Universes;
class UniverseCreationController extends BaseController
{
public function createUniverse($request,$response)
{
return $this->container->view->render($response,'travellers/universe/create_universe.phtml');
}
public function generateUniverse($request,$response)
{
$universe = new Universes($this->db);
return 'generateSector';
}
}
中完成,它标识具有相同间隔符的hashref组
partition_equal()
输出
kA => [ { energy => -3.3, spacer => "CAGT" }, { energy => -2.5, spacer => "GTT" }, { energy => -4.3, spacer => "AGGCACC" }, ], kB => [ { energy => -4.4, spacer => "CAGT" }, { energy => -4.1, spacer => "GTT" }, { energy => -4.1, spacer => "TTG" }, ],
不保持arrayrefs内的顺序;新的arrayref具有第一个具有唯一间隔值的hashrefs,然后是具有最低能量值的那些(对于具有相同间隔值的每个原始组)。
子对输入的间隔值进行排序,以便通过简单地遍历排序的数组并仅比较邻居来识别相等的值。这应该是合理有效的。
答案 1 :(得分:0)
喜欢这个
$_=$hash{'hsa_circ_0024017|chr11:93463035-93463135+|NM_033395|KIAA1731 FORWARD'}->[0]{energy};
print $_ ."\n";
所以它 $这{散列} - GT; [ARRAY_REF] {散列]
答案 2 :(得分:0)
for my $line (keys(%by_line)) {
my $spacer_defs = $by_line{$line};
...
}
或
for my $spacer_defs (values(%by_line)) {
...
}
将依次为每行提供(引用) spacer definitions 数组。然后,您可以按如下方式编辑该数组:
my %uniq_spacer_defs;
for my $spacer_def (@$spacer_defs) {
my $spacer = $spacer_def->{spacer};
$uniq_spacer_defs{$spacer} = $spacer_defs
if !$uniq_spacer_defs{$spacer}
|| $uniq_spacer_defs{$spacer}{energy} < $spacer_def->{energy};
}
@$spacer_defs = values(%uniq_spacer_defs);
注意:
“间隔定义”的顺序可能会改变。如果这是一个问题,请替换
@$spacer_defs = values(%uniq_spacer_defs);
与
@$spacer_defs = grep { $uniq_spacer_defs{$_->{spacer}} == $_ } @$spacer_defs;
如果两个间隔物定义具有相同的间隔物和相同的能量,则会遇到遇到的第一个。