我遇到了一段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);
}
答案 0 :(得分:4)
$lookup -> {$chr} -> {$start} = $end
$lookup
是(被视为)哈希散列的指针。 $chr
是第一级键,值是另一个哈希指针。 $start
是第二级密钥,其值为$end
。
此代码依赖于autovivification。虽然$lookup
永远不会被初始化为任何东西,但是当使用Perl中的指针时,如果你假装/相信结构存在,它就存在了。同上$hash
变量(数组的散列。)
此处未使用的另一个Perl功能是箭头折叠,这样索引(任意一种)之间的箭头都是可选的。所以这段代码也可以读取:
$lookup->{$chr}{$start} = $end
可能更好地揭示两级哈希结构。
顶层的 $lookup
和$hash
是并行哈希值,因为它们的第一级键是相同的。 $hash
结构似乎是一种优化,因为它可以从$lookup
计算:
keys(%{$lookup->{$chr}})
VS
@{$hash->{$chr}}
区别在于$hash
会保留$start
值的文件顺序而$lookup
则不会。
答案 1 :(得分:1)
通过说{"members": [{"user_id": 1, "last_name": "argento", "first_name": "pepe", "firebase_id": "123", "profile_pic": "storage/image.png", "is_moderator": "t"}]}
(第二个箭头是可选的,您也可以编写$lookup->{$chr}->{$start} = $end
),$lookup->{$chr}{$start} = $end
标量将转换为对具有染色体名称作为键的哈希的引用。
$lookup
作为引用的哈希中的每个条目又是对哈希的哈希引用,其中起始位置为键,结束位置为值。
您可以通过添加
轻松调查循环后的数据结构$lookup
您会看到类似
的内容use Data::Dumper;
print Dumper($lookup);
这告诉你$VAR1 = {
'chr2' => {
'1234' => 5678
},
'chr1' => {
'1234' => 5678
}
};
(松散地说)是“散列哈希”。