0

我有一个数组(@pssm_list),其中包含这样的文件

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

1.nr.pssm文件列表的名称是226.nr.pssm

我尝试使用sort(@pssm_list),但顺序不是从 1 到 226

所以我尝试编写这样的代码

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++;
}

我想知道是否有任何解决方案可以在一行中对列表进行排序?

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;

这依赖于 where int()eg的宽容性质int( "99xyz" ) == 99

如果您的文件名更复杂,则应替换int( $a )为提取数字部分的函数调用,或map按照 mapec 的建议使用。

编辑:我的第一次尝试很糟糕,抱歉,我在 Ruby 中工作太久了,无法记住正确的 Perl 语法!

于 2013-08-13T08:28:36.037 回答