【问题标题】:How do multiple arrow operators in series work in Perl?在 Perl 中,多个箭头运算符如何串联工作?
【发布时间】:2016-08-14 05:18:08
【问题描述】:

我今天遇到了一段不知道如何解释的 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);
}

【问题讨论】:

    标签: perl


    【解决方案1】:
    $lookup -> {$chr} -> {$start} = $end
    

    $lookup 是(被视为)指向散列散列的指针。 $chr 是一级键,值是另一个哈希指针。 $start 为二级键,其值为$end

    此代码依赖于autovivification。尽管$lookup 从未初始化为任何东西,但在 Perl 中使用指针时,如果您假装/相信结构存在,它就存在。 $hash 变量(数组的哈希)也是如此。

    这里没有用到的另一个 Perl 特性是 箭头折叠,这样索引之间的箭头(任何一种)都是可选的。所以这段代码也可以阅读:

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

    可能更好地揭示两级哈希结构。

    $lookup$hash 在顶层是并行哈希,因为它们的第一级键是相同的。 $hash 结构似乎是一种优化,因为它可以从 $lookup 计算得出:

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

    对比

    @{$hash->{$chr}}
    

    区别在于$hash 会保留$start 值的文件顺序,而$lookup 不会。

    【讨论】:

      【解决方案2】:

      通过说$lookup-&gt;{$chr}-&gt;{$start} = $end(第二个箭头是可选的,你也可以写$lookup-&gt;{$chr}{$start} = $end),$lookup 标量被转换为对以染色体名称作为键的散列的引用。

      $lookup 引用的哈希中的每个条目反过来又是对以开始位置为键、以结束位置为值的哈希的哈希引用。

      你可以很容易地通过添加来研究循环后的数据结构

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

      你会看到类似的东西

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

      这告诉您$lookup (粗略地说)是“散列的散列”。

      【讨论】:

        猜你喜欢
        • 2012-05-27
        • 1970-01-01
        • 2014-01-30
        • 1970-01-01
        • 1970-01-01
        • 2016-01-24
        • 2012-04-19
        • 2012-12-04
        • 1970-01-01
        相关资源
        最近更新 更多