2015-04-01 166 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'} });