【问题标题】:find biggest hash value regarding each key in perl找到关于 perl 中每个键的最大哈希值
【发布时间】:2012-10-01 14:04:50
【问题描述】:

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

>test1
MATRTQARGA 
>test2
MRIIEGKLQLQG
>test1
 MATRTQARGAVVELLYAFESGNEEIKKIASSML

在我想要的结果中

>test2
MRIIEGKLQLQG
>test1
MATRTQARGAVVELLYAFESGNEEIKKIASSML

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

【问题讨论】:

    标签: perl hash key


    【解决方案1】:

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

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

    【讨论】:

    • :为什么当我尝试以相同方式从文件中读取时它不起作用
    【解决方案2】:

    另一种不太直观的方式

    #!/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 哈希并将其打印到文件中,您最终将得到您想要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-01
      • 2012-10-11
      • 2011-08-27
      • 2018-03-14
      • 2021-06-19
      • 1970-01-01
      • 2017-06-20
      • 2011-12-31
      相关资源
      最近更新 更多