迭代函数

时间:2017-03-01 12:07:18

标签: perl function hash

我有一个输入文件:

id_1    10  15  20:a:4:c
id_2    1   5   2:2:5:c
id_3    0.4 3   12:1:4:1
id_4    18  2   9:1:0/0:1
id_5    a   b   c:a:foo:2

我有很多这种类型的文件,我想在不同的程序中解析,所以我想创建一个函数,返回一个易于访问的哈希。

我之前没有写过这样的函数,我不确定如何正确访问返回的哈希值。这是我到目前为止所得到的:

Library_SO.pm

#!/urs/bin/perl

package Library_SO;
use strict;
use warnings;

sub tum_norm_gt {

    my $file = shift;
    open my $in, '<', $file or die $!;

    my %SVs;
    my %info;

    while(<$in>){
        chomp;

        my ($id, $start, $stop, $score) = split;
        my @vals = (split)[1..2];

        my @score_fields = split(/:/, $score);

        $SVs{$id} = [ $start, $stop, $score ];

        push @{$info{$id}}, @score_fields ;
    }
    return (\%SVs, \%info);
}

1;

我的主要剧本: 的 get_vals.pl

#!/urs/bin/perl

use Library_SO;
use strict;
use warnings;

use feature qw/ say /;
use Data::Dumper;

my $file = shift or die $!;

my ($SVs, $info) = Library_SO::tum_norm_gt($file);

print Dumper \%$SVs;
print Dumper \%$info;

# for (keys %$SVs){
#   say;
#   my @vals = @{$SVs{$_}}; <- line 20
# }

我称之为: perl get_vals.pl test_in.txt

Dumper输出是我所希望的,但当我尝试迭代返回的哈希(?)并访问值时(例如在注释掉的部分中),我得到:

Global symbol "%SVs" requires explicit package name at get_vals.pl line 20.
Execution of get_vals.pl aborted due to compilation errors. 

我完全颠倒了这个吗?

1 个答案:

答案 0 :(得分:3)

您的库函数返回两个hashref。如果您现在想要访问值,则必须取消引用hashref:

my ($SVs, $info) = Library_SO::tum_norm_gt($file);

#print Dumper \%$SVs;
# Easier and better readable:
print Dumper $SVs ;

#print Dumper \%$info;
# Easier and better readable:
print Dumper $info ;


for (keys %{ $SVs } ){ # Better visual derefencing
   say;
   my @vals = @{$SVs->{$_}}; # it is not $SVs{..} but $SVs->{...}
}