2016-08-14 60 views
2

我碰到了一段Perl代碼,我不確定今天如何解釋。具體來說,行$lookup -> {$chr} -> {$start} = $end,因爲我不確定多箇中綴解除引用操作符是如何工作的。系列中的多個箭頭操作符如何在Perl中工作?

輸入文件包含製表符分隔的染色體名稱($chr),開始位置($start),並在每行上結束位置($end)。我知道作者正在創建一個哈希表,其中​​映射到與每個染色體對應的$start值的數組,但是我無法確定他正在嘗試使用下一行完成的工作。任何有識之士將不勝感激。

my $hash; 
my $lookup; 
if (defined $bed_file) { 
    open(FILE, $bed_file); 
    while (my $line = <FILE>) { 
     chomp $line; 
     my ($chr, $start, $end) = split(/\t/, $line); 
     push(@{$hash -> {$chr}}, $start); 
     $lookup -> {$chr} -> {$start} = $end; 
    } 
    close(FILE); 
} 

回答

3
$lookup -> {$chr} -> {$start} = $end 

$lookup是(被視爲)的指針散列的散列。​​是第一級密鑰,該值是另一個哈希指針。 $start是第二級密鑰,其值爲$end

此代碼依賴於autovivification。雖然$lookup從不初始化爲任何東西,但在Perl中使用指針時,如果您假裝/相信存在結構,它就存在。

另一個Perl功能,這裏沒有使用,是箭頭摺疊,使得索引之間(任何一種)的箭頭是可選的。所以這段代碼也可以這樣讀取:

$lookup->{$chr}{$start} = $end 

可能更好的揭示了兩級哈希結構。

$lookup$hash在頂層是平行散列,因爲它們的第一級鍵是相同的。該$hash結構似乎是因爲它可以從$lookup計算的優化:

keys(%{$lookup->{$chr}}) 

@{$hash->{$chr}} 

區別在於$hash將保持$start值的文件順序和$lookup不會。

1

通過說$lookup->{$chr}->{$start} = $end(第二個箭頭是可選的,你也可以寫$lookup->{$chr}{$start} = $end),$lookup標量變成了一個對染色體名稱作爲關鍵字的散列的引用。

$lookup所引用的散列中的每個條目依次是對散列的散列引用,其起始位置作爲關鍵字並且結束位置作爲值。

你可以很容易地通過添加

use Data::Dumper; 
print Dumper($lookup); 

調查循環後的數據結構,你會看到類似

$VAR1 = { 
      'chr2' => { 
         '1234' => 5678 
        }, 
      'chr1' => { 
         '1234' => 5678 
        } 
     }; 

這就告訴你,$lookup是(嚴格意義上)一個「哈希散列」。

相關問題