我有一个包含文件列表的数组。我想以某种方式对它进行排序,它可以让我在数组的开头有 .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/