2017-03-09 18 views
0

我目前正在研究一些由以前的实习生编写的代码。我对Perl不熟悉,所以在理解他的代码实际执行的过程中遇到了一些问题。所以它看起来像:Perl代码!它做什么(散列哈希)?

$Hash{Key1}{Key2}++; 

原始代码是:

$genotypes_parent2_array{$real_genotype}{$individu_depth}++; 

我用看散列以这种形式$哈希{主要}为了得到价值,但我用这一个挣扎。有什么帮助吗? 谢谢!

+1

关于复杂结构的更多信息可以在['perldsc'](http://perldoc.perl.org/perldsc.html)中找到。 –

+0

散列就像一个数组,而不是被一个数字索引, 0 ... 10“,它被更像一个字符串的键索引。哈希散列就像一个二维数组,但是它不是两个数字索引,而是由两个键(或字符串)索引。 –

回答

-1

%Hash是哈希散列。

该代码将1添加到值为$Hash{Key1}{Key2},这是散列元素的值。

+0

@Downvoter:一个解释会很好 – Jens

+0

现在看来我更加清楚。我认为“++”符号将1加到键1(或2)的值上。由于它们可能是字符串,我不知道它是如何可能的。实际上,他只是用ordrer中的两个键初始化了一个散列(之前为空),以便在每次验证特定条件时向该空值添加1。 谢谢你的帮助。 :) –

+0

它被称为autovivification(请参阅https://www.effectiveperlprogramming.com/2011/04/understand-autovivification/)。 $哈希是一个哈希。值$ Hash {Key1}是对新创建的散列的引用。值$ Hash {Key1} - > {Key2}( - >是可选的)将是将被递增的数字。 – BOC

4

%genotypes_parent2_array是一个散列(所以这不是一个很好的变量名称)散列中的每个值都是一个散列引用。所以有效地你有散列哈希。

$genotypes_parent2_array{$real_genotype}查找散列中的密钥$real_genotype。这个值(正如我们上面所说)是一个散列引用。如果您有散列引用,那么您可以使用箭头在引用的散列中查找值。所以我们可以使用如下代码得到二级哈希值:

$genotypes_parent2_array{$real_genotype}->{$individu_depth} 

但是,Perl有一个很好的语法糖。当你有两对“查找括号”彼此相邻时(就像我们在这里),你可以省略箭头。所以你可以得到完全一样的效果:

$genotypes_parent2_array{$real_genotype}{$individu_depth} 

这就是我们在这里。我们在散列%genotypes_parent2_array中查找关键$real_genotype。这给了我们一个哈希引用。然后,我们在引用的数组中查找关键字$individu_depth,这给了我们第二级哈希值。您的代码然后递增该值。

手册页perldoc perldsc是使用引用来构建Perl中的复杂数据结构的很好的介绍。另外,我发现Data::Dumper对于显示一个复杂数据结构的外观非常有用。