0

我有一个具有这种结构的文件

>test1
MATRTQARGA 
>test2
MRIIEGKLQLQG
>test1
 MATRTQARGAVVELLYAFESGNEEIKKIASSML

在我想要的结果中

>test2
MRIIEGKLQLQG
>test1
MATRTQARGAVVELLYAFESGNEEIKKIASSML

我正在考虑一个哈希结构,其中键是带有 > 的行,每个 > 行之后的下一行将是每个键的值,然后我如何打印长度最长的字符串,但是由于哈希结构不能有重复的键我不知道该怎么办

4

2 回答 2

2

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

my %longest;
my $curkey;

while (<>) {
  chomp;
  if (/^>/) {
    $curkey = $_;
    $curkey =~ s/^.//; # Remove '>' prefix;
    next;
  } 
  if (length($_) > length($longest{$curkey})) {
    $longest{$curkey} = $_;
  }
}
于 2012-10-01T14:14:12.587 回答
-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哈希并将其打印到文件中,您最终将得到您想要的。

于 2012-10-01T15:37:29.937 回答