我有一个输入文件:
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.
我完全颠倒了这个吗?
答案 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->{...}
}