查找perl中每个键的最大哈希值

查找perl中每个键的最大哈希值,perl,hash,key,Perl,Hash,Key,我有一个这样结构的文件 >test1 MATRTQARGA >test2 MRIIEGKLQLQG >test1 MATRTQARGAVVELLYAFESGNEEIKKIASSML 我想要的结果是什么 >test2 MRIIEGKLQLQG >test1 MATRTQARGAVVELLYAFESGNEEIKKIASSML 我在考虑一个哈希结构哪些键是带有>的行,每个>行后面的下一行将是值,然后对于每个键,我知道如何打印长度最长的字符串,但是由于哈希结构不能有

我有一个这样结构的文件

>test1
MATRTQARGA 
>test2
MRIIEGKLQLQG
>test1
 MATRTQARGAVVELLYAFESGNEEIKKIASSML
我想要的结果是什么

>test2
MRIIEGKLQLQG
>test1
MATRTQARGAVVELLYAFESGNEEIKKIASSML

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

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

my %longest;
my $curkey;

while (<>) {
  chomp;
  if (/^>/) {
    $curkey = $_;
    $curkey =~ s/^.//; # Remove '>' prefix;
    next;
  } 
  if (length($_) > length($longest{$curkey})) {
    $longest{$curkey} = $_;
  }
}
my%最长;
我的$curkey;
而(){
咀嚼;
如果(/^>/){
$curkey=$\ux;
$curkey=~s/^./#删除'>'前缀;
下一个
} 
if(长度($)>长度($longest{$curkey})){
$longest{$curkey}=$\;
}
}

另一种不那么直观的方式

#!/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
#/usr/bin/env perl
严格使用;
使用数据::转储程序;
本地$/=“>”;#这里并不真正需要本地,因为它在全球范围内。。
我的%unqs;
while(){
下一个if(m/^\s*>/);
my@arr=grep{not m/>^\s*$/}拆分(/\n/);
$unqs{$arr[0]}=$arr[1]if(length($arr[1])>length($unqs{$arr[0]}));
}
打印转储程序(\%unqs);
__资料__
>测试1
马特卡加
>测试2
MRIIEGKLQLQG
>测试1
Matrtqargavellyafesgneeikkiassml

现在您可以使用
%unqs
散列并将其打印到文件中,您将得到您想要的内容。

:为什么我尝试以相同的方式读取文件时它不起作用