perl - 多个箭头运算符在 Perl 中如何串联工作?

标签 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);
}

最佳答案

$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/

相关文章:

apache - 安装 mod_perl2 时出错

perl - 终端中的键盘事件

perl - 在perl中获取数组中数组的大小

perl - Mojolicious 和 Passwd::Unix

perl - 如何在 Perl 中使用代码引用作为回调?

perl - 如何使用 Perl CGI 脚本提供图像?

perl - 我如何在运行时在 Perl 中绑定(bind) DBI 参数?

perl - 如何驯服 Perl 文件的 Vim 关键字(不是omni)完成?

perl - 仅当文件尚未打开时,如何才能在 Perl 中打开它?

perl - ssh命令未运行perl脚本