如何引用哈希数组的哈希值以比较值

时间:2017-07-26 19:51:39

标签: arrays perl hashmap perl-data-structures

我有以下数据结构:

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 ...),我想将子哈希(间隔符)一起比较。请原谅我,我正在努力说出这一点。这当然是一小部分数据样本。简而言之,我的目标是检测具有相同间隔的哈希阵列,如果它们具有相同的间隔,那么我想选择具有最低能量分数的哈希数组。

3 个答案:

答案 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;
    
  • 如果两个间隔物定义具有相同的间隔物和相同的能量,则会遇到遇到的第一个。