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 に答える