Perl中的多个箭头操作符如何工作?

时间:2016-08-14 05:18:09

标签: perl

我遇到了一段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);
}

2 个答案:

答案 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 } }; (松散地说)是“散列哈希”。