2017-03-09 45 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對於顯示一個複雜數據結構的外觀非常有用。