【问题标题】:Make hash from regex expression patten match -error从正则表达式模式匹配 -error 进行哈希
【发布时间】:2015-04-01 14:34:09
【问题描述】:

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

【问题讨论】:

  • 如果您首先将数据split 放入字段中,然后只在您感兴趣的字段上使用正则表达式,您的正则表达式会更易于管理。如果您的字段可能包含逗号,请使用Text::CSV而不是split

标签: regex perl hash pattern-matching


【解决方案1】:

改变这一行:

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

$hash{$k} = $v;

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

【讨论】:

    【解决方案2】:

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

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

    1. 你不断地用一个元素创建一个新数组。替换

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

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

      print $out_fh $hash{'Cryptophyta'};
      

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

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 2011-07-08
      • 1970-01-01
      • 2017-02-18
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多