我正在使用regex表达式创建哈希。我在下面运行我的程序,最后检查一下,看看我的哈希是否正常。但是我一直得到一个值的错误。我得到这个ARRAY(0x1a1c740),它应该是437768.键可以显示确定。我没有拆分因为我需要钥匙才能成为物种名称的第一部分。这就是我所匹配的。
# "aaaaaaaaaa","aaaaaaaaaa","437768","Cryptophyta sp. CR-MAL06",0
非常感谢您给予的帮助。
use strict;
use warnings;
open (my $in_fh,"$ARGV[0]") or die "Failed to open file: $!\n";
open (my $out_fh, ">genus.txt");
my %hash;
while ( my $line = <$in_fh> ) {
#
# "aaaaaaaaaa","aaaaaaaaaa","437768","Cryptophyta sp. CR-MAL06",0
#
if ($line =~ m/\"+\w+\"+\,+\"+\w+\"+\,+\"+(\d+)\"+\,+\"+(\w+)+.+/) {
my $v = $1;
my $k = $2;
$hash{$k} = [$v];
}
}
if (exists $hash{'Cryptophyta'}) {
print $out_fh $hash{'Cryptophyta'};
}
else {
print $out_fh "NO\n";
}
close $in_fh;
close $out_fh;
答案 0 :(得分:2)
更改此行:
$hash{$k} = [$v];
到
$hash{$k} = $v;
[$v]
是对数组的引用,但您希望存储标量。
答案 1 :(得分:0)
[ ]
创建一个数组,将包含的表达式的结果赋给该数组,并返回对该数组的引用。这是您正在打印的参考。
你可能试图支持多场比赛。两个问题:
您不断创建一个包含一个元素的新数组。取代
$hash{$k} = [ $v ];
与
push @{ $hash{$k} }, $v;
您打印对数组的引用而不是数组的内容。取代
print $out_fh $hash{'Cryptophyta'};
与
print $out_fh join(', ', @{ $hash{'Cryptophyta'} });