我遇到了一段 Perl 代码,我今天不确定如何解释。具体来说,行 $lookup -> {$chr} -> {$start} = $end
因为我不确定多个中缀取消引用运算符如何串联工作。
输入文件包含制表符分隔的染色体名称($chr)
、起始位置($start)
和结束位置($end)
在每一行。我知道作者正在创建一个哈希表,其中 $chr
映射到具有与每个染色体对应的 $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);
}
最佳答案
$lookup -> {$chr} -> {$start} = $end
$lookup
是(被视为)指向散列的散列的指针。 $chr
是一级key,value是另外一个hash指针。 $start
为二级键,值为$end
。
此代码依赖autovivification .虽然 $lookup
从未被初始化为任何东西,但在 Perl 中使用指针时,如果您假装/相信某个结构存在,那么它确实存在。 $hash
变量(数组的散列)也是如此。
此处未使用的另一个 Perl 功能是箭头折叠,这样索引(无论哪种)之间的箭头都是可选的。所以这段代码也可以读作:
$lookup->{$chr}{$start} = $end
可能更好地揭示两级哈希结构。
顶层的$lookup
和 $hash
是并行哈希,因为它们的第一级键是相同的。 $hash
结构似乎是一种优化,因为它可以从 $lookup
计算得出:
keys(%{$lookup->{$chr}})
对比
@{$hash->{$chr}}
区别在于 $hash
会保留 $start
值的文件顺序,而 $lookup
不会。
关于perl - 多个箭头运算符在 Perl 中如何串联工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38939388/