perl: using push() on an array inside a hash

北城以北 提交于 2019-12-12 06:38:27

问题


Is it possible to use Perl's push() function on an array inside a hash?

Below is what I believe to be the offending part of a larger program that I am working on.

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
        }

    }

}

Later I try to interact with these arrays using

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");
        }

but it appears as if the arrays I created are empty.

If $domains{$identifier}[0] is an array, then why can I not use the push statement to add an element to it?


回答1:


$domains{identifier}[0] is not an array.
$domains{identifier}[0] is an array element, a scalar.
$domains{identifier}[0] is a reference to an array.

If it's

@array

when you have an array, it's

@{ ... }

when you have a reference to an array, so

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

References:

  • Mini-Tutorial: Dereferencing Syntax
  • References quick reference
  • perlref
  • perlreftut
  • perldsc
  • perllol


来源:https://stackoverflow.com/questions/34007154/perl-using-push-on-an-array-inside-a-hash

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!