从正则表达式模式匹配-error制作哈希

时间:2015-04-01 14:34:10

标签: regex perl hash pattern-matching

我正在使用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;  

2 个答案:

答案 0 :(得分:2)

更改此行:

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

$hash{$k} = $v;

[$v]是对数组的引用,但您希望存储标量。

答案 1 :(得分:0)

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

你可能试图支持多场比赛。两个问题:

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

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

    push @{ $hash{$k} }, $v;
    
  2. 您打印对数组的引用而不是数组的内容。取代

    print $out_fh $hash{'Cryptophyta'};
    

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