0

I have an array(@pssm_list) which contains files like this

1.nr.pssm
2.nr.pssm
3.nr.pssm
4.nr.pssm
5.nr.pssm
6.nr.pssm
7.nr.pssm

the name of file list is 1.nr.pssm to 226.nr.pssm

I try to use sort(@pssm_list) , but the order is not from 1 to 226

so I try to write the code like this

opendir(pssm_handle,$ARGV[0]);
@pssm_list = grep(/\.pssm/,readdir(pssm_handle));

$tag = 0;
until($tag > 226)
{
        foreach $file (@pssm_list)
        {
                @Temp = split("[.]",$file);
                if($Temp[0] == $tag)
                {
                        push(@Sorted,join("",$file));
                }
        }
        $tag++;
}

I want to know does there exists any solution can sort the list in one line?

4

3 に答える 3

5

私もこの問題に遭遇し、 Sort::Naturallyと呼ばれるこのパッケージを使用して、数値を正しく並べ替えることができました。

自然な並べ替えでは、数値部分文字列は数値的に比較され、他の単語文字は語彙的に比較されます。

于 2013-08-13T08:28:46.840 に答える
3
my @pssm_list = 
  map $_->[0],
  sort { $a->[1] <=> $b->[1] }
  map [ $_, /(\d+)/ ],
  grep(/\.pssm/,readdir(pssm_handle));

または少し効率の悪い並べ替え:

my @pssm_list =
  sort { 
    my ($x,$y) = map /(\d+)/, ($a,$b); 
    $x <=> $y;
  }
  grep(/\.pssm/,readdir(pssm_handle));
于 2013-08-13T08:29:42.840 に答える
3

私はこれがそれを行うべきだと思います:

@Sorted = sort { int( $a ) <=> int( $b ) } @pssm_list;

int()これは、たとえばの寛容な性質に依存していint( "99xyz" ) == 99ます。

ファイル名がより複雑な場合はint( $a )、数値部分を抽出する関数呼び出しに置き換えるかmap、mpapec の提案に従って使用する必要があります。

編集: 私の最初の試みはかなり外れていました。申し訳ありませんが、Ruby で作業する時間が長すぎて、正しい Perl 構文を覚えることができませんでした。

于 2013-08-13T08:28:36.037 に答える