perl - 如何对数组进行排序,以便某些文件扩展名排序到顶部?

标签 perl arrays

我有一个包含文件列表的数组。我想以某种方式对它进行排序,它可以让我在数组的开头有 .txt 文件,然后是其余的文件。

这就是我现在正在做的,效果很好。

@files = (grep(/\.txt$/,@files),grep(!/\.txt$/,@files));

有没有更好的方法来做到这一点?

最佳答案

您询问了有关为多个文件扩展名执行此操作的后续评论。在那种情况下,我会建立 Schwartzian 变换。如果您不熟悉 ST,我推荐 Joseph Hall 在 Effective Perl Programming 中的解释。虽然Second Edition很快就要出来了,我们基本上离开了他的解释 first edition一样好。谷歌图书似乎只显示第一版每页的一英寸,所以你在那里不走运。

在这个答案中,我使用加权函数来决定哪些扩展应该移到顶部。如果扩展没有明确的权重,我只是按字典顺序对其进行排序。你可以用 sort 玩弄准确获得您想要的订单:

@files = qw(
    buster.pdf
    mimi.xls
    roscoe.doc
    buster.txt
    mimi.txt
    roscoe.txt
    buster.rpm
    mimi.rpm
    );

my %weights = qw(
    txt 10
    rpm  9
    );

my @sorted = 
    map { $_->{name} }
    sort { 
        $b->{weight} <=> $a->{weight}
         ||
        $a->{ext}    cmp $b->{ext}
         ||
        $a cmp $b
        }
    map {
        my( $ext ) = /\.([^.]+)\z/;
            { # anonymous hash constructor
            name => $_,
            ext => $ext,
            weight => $weights{$ext} || 0,
            }
        }
    @files;

$" = "\n";
print "@sorted\n";

关于perl - 如何对数组进行排序,以便某些文件扩展名排序到顶部?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2525400/

相关文章:

perl - 使用 perl 代码从机场代码中查找时区

perl - 这种改组算法的效率和质量如何?

arrays - 创建对象(变量名 : [NSArray] ) from list of words

java - 将 Object[] 转换为 java 中的引用类型数组

c - 在 MIP 中使用数组

mysql - Perl将许多插入语句插入mysql数据库

perl - 如何在 perl 脚本退出之前运行一段代码

perl - 这种代码有什么意义?

javascript - 两 block 代码分开工作但不一起工作,我在哪里出错?

java - 如何使用 RxJava TestObserver 断言两个字符串列表?