2015-04-01 168 views
0

我正在从正则表达式进行散列。我在下面运行我的程序,并在最后查看我的散列是否正常。但是我不断收到一个错误值,我得到这个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; 
+2

你的正则表达式会更便于管理,如果你第一个'split'您的数据到字段,然后只用在你感兴趣的领域的正则表达式。如果你的字段可以包含逗号,使用['Text :: CSV'](https://metacpan.org/pod/Text::CSV)而不是'split'。 – ThisSuitIsBlackNot 2015-04-01 14:36:21

回答

2

改变这一行:

$hash{$k} = [$v]; 

$hash{$k} = $v; 

[$v]是一个数组的引用,但你要存储一个标量。

0

[ ]创建一个数组,将包含的表达式的结果赋值给该数组,并返回对该数组的引用。这是您正在打印的参考。

您可能试图支持多个匹配项。两个问题:

  1. 您不断创建一个包含一个元素的新数组。更换

    $hash{$k} = [ $v ]; 
    

    push @{ $hash{$k} }, $v; 
    
  2. 您打印参考阵列,而不是数组的内容。更换

    ​​

    print $out_fh join(', ', @{ $hash{'Cryptophyta'} });