从正则表达式表达式匹配匹配 - 错误
问题描述:
我正在从正则表达式进行散列。我在下面运行我的程序,并在最后查看我的散列是否正常。但是我不断收到一个错误值,我得到这个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;
答
改变这一行:
$hash{$k} = [$v];
到
$hash{$k} = $v;
[$v]
是一个数组的引用,但你要存储一个标量。
答
[ ]
创建一个数组,将包含的表达式的结果赋值给该数组,并返回对该数组的引用。这是您正在打印的参考。
您可能试图支持多个匹配项。两个问题:
-
您不断创建一个包含一个元素的新数组。更换
$hash{$k} = [ $v ];
与
push @{ $hash{$k} }, $v;
-
您打印参考阵列,而不是数组的内容。更换
与
print $out_fh join(', ', @{ $hash{'Cryptophyta'} });
你的正则表达式会更便于管理,如果你第一个'split'您的数据到字段,然后只用在你感兴趣的领域的正则表达式。如果你的字段可以包含逗号,使用['Text :: CSV'](https://metacpan.org/pod/Text::CSV)而不是'split'。 – ThisSuitIsBlackNot 2015-04-01 14:36:21