从正则表达式模式匹配中生成哈希 - 错误

Make hash from regex expression patten match -error

我正在从正则表达式中生成散列。我 运行 我的程序在下面,我在最后检查我的哈希是否正常。但是我一直收到该值的错误。我得到这个 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 = ;
         my $k = ;

         $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] 是对数组的引用,但您想存储一个标量。

[ ] 创建一个数组,将封闭表达式的结果分配给该数组,并且 returns 对数组的引用。这是您正在打印的参考资料。

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

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

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

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

    print $out_fh $hash{'Cryptophyta'};
    

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