perl:在散列内的数组上使用push()

时间:2015-11-30 20:14:13

标签: arrays perl debugging push

是否可以在散列内的数组上使用Perl的push()函数?

以下是我认为是我正在开展的大型计划的违规部分。

my %domains = ();
open (TABLE, "placeholder.foo") || die "cannot read domtblout file\n";
while ($line = <TABLE>)
{
    if (!($line =~ /^#/))                                                                 
    {
            @split_line = split(/\t/, $line);                                              # splits on tabs - some entries contain whitespace
        if ($split_line[13] >= $domain_cutoff)
        {
            push($domains{$split_line[0]}[0], $split_line[19]);                    # adds "env from" coordinate to array
            push($domains{$split_line[0]}[1], $split_line[20]);                    # adds "env to" coordinate to array
            # %domains is a hash, but $domains{identifier}[0] and $domains{$identifier}[1] are both arrays
            # this way, all domains from one sequence are stored with the same hash key, but can easily be processed iteratively
        }

    }

}

稍后我尝试使用

与这些数组进行交互
for ($i = 0, $i <= $domains{$identifier}[0], $i++)
        {
            $from = $domains{$identifier}[0][$i];
            $to = $domains{$identifier}[1][$i];
            $length = ($to - $from);
            $tmp_seq =~ /.{$from}(.{$length})/;
            print("$header"."$1");
        }

但似乎我创建的数组是空的。

如果$ domains {$ identifier} [0]是一个数组,为什么我不能使用push语句向其添加元素?

1 个答案:

答案 0 :(得分:4)

$domains{identifier}[0]不是数组。
$domains{identifier}[0]是一个数组元素,一个标量。
$domains{identifier}[0]是对数组的引用。

如果是

@array

当你有一个阵列时,它就是

@{ ... }

当你有一个数组的引用时,所以

push(@{ $domains{ $split_line[0] }[0] }, $split_line[19]);

参考文献: