找到关于perl中每个键的最大哈希值

时间:2012-10-01 14:04:51

标签: perl hash key

我有一个具有此结构的文件

>test1
MATRTQARGA 
>test2
MRIIEGKLQLQG
>test1
 MATRTQARGAVVELLYAFESGNEEIKKIASSML

在我想要的结果中

>test2
MRIIEGKLQLQG
>test1
MATRTQARGAVVELLYAFESGNEEIKKIASSML

我在想一个哈希结构哪些键是>并且每个>行之后的下一行将是值,然后对于每个键我有些如何打印具有最长长度的字符串,但由于哈希结构不能具有重复键,我不知道该怎么做

2 个答案:

答案 0 :(得分:2)

您不需要重复键,只需存储每个键的当前最长值,并在获得更长的键时替换它:

my %longest;
my $curkey;

while (<>) {
  chomp;
  if (/^>/) {
    $curkey = $_;
    $curkey =~ s/^.//; # Remove '>' prefix;
    next;
  } 
  if (length($_) > length($longest{$curkey})) {
    $longest{$curkey} = $_;
  }
}

答案 1 :(得分:-1)

另一种不那么直观的方式

#!/usr/bin/env perl
use strict;
use Data::Dumper;

local $/ = ">"; # local not really needed here, as its in the global scope..
my %unqs;

while(<DATA>) {
    next if (m/^\s*>/);
    my @arr = grep { not m/>|^\s*$/ } split(/\n/);
    $unqs{$arr[0]} = $arr[1] if (length($arr[1]) > length($unqs{$arr[0]}));
}

print Dumper(\%unqs);

__DATA__
>test1
MATRTQARGA 
>test2
MRIIEGKLQLQG
>test1
MATRTQARGAVVELLYAFESGNEEIKKIASSML

现在您可以使用%unqs哈希并将其打印到文件中,最终会得到您想要的内容。