我有一个源文件夹,里面有许多不同名称的文件:
20160311_TXT_XPL_SLA_Attribution
20160301_TXT_APL_SLA_Attribution
20160301_TXT_XPL_SLA_Attribution
20160302_TXT_APL_SLA_Attribution我必须根据TXT_***_SLA之间的字母对文件进行排序。
我编写了Perl脚本,但这不是正确的排序:
#!/usr/bin/perl
$dir = "E://Unix";
my $file;
my @files;
opendir (DIR, "$dir");
while ($file = readdir(DIR))
{
push (@files, $file);
}
print
map { $_->[1] }
sort
map { /TXT(.*)SLA/; [$1, $_] }
@files;
foreach $file (@files)
{
print "$file\n";
}
closedir(DIR);我甚至检查了删除下划线后的,但没有看到任何排序模式的变化。我是Perl的新手&如果有人能告诉我哪里出了问题,那将是非常有帮助的。
输出即将到来:
20160301_TXT_APL_SLA_Attribution.txt
20160301_TXT_XPL_SLA_Attribution.txt
20160302_TXT_APL_SLA_Attribution.txt
20160311_TXT_XPL_SLA_Attribution.txt预期为:
20160301_TXT_APL_SLA_Attribution.txt
20160302_TXT_APL_SLA_Attribution.txt
20160301_TXT_XPL_SLA_Attribution.txt
20160311_TXT_XPL_SLA_Attribution.txt使用的正则表达式:
/(TXT)(.*)(SLA)/发布于 2016-03-12 05:55:15
有两个问题,都在这里:
print
map { $_->[1] }
sort
map { /TXT(.*)SLA/; [$1, $_] }
@files;首先,您的Schwartzian Transform缺少排序功能。所以它会对数组引用的字符串版本进行排序,比如ARRAY(0x7ff730805468)。您需要添加类似于sort { $a->[0] cmp $b->[0] }的内容。
其次,排序不会发生在适当的位置。必须将输出分配回@files。
发布于 2016-03-12 11:32:30
只有当数据集很大或者排序函数复杂而缓慢时,Schwartzian变换才是有用的优化;否则,它只会导致代码不清晰。因此,很遗憾,每当有人想要按数据函数而不是数据本身进行排序时,它就成了首选模式
有几种选择,您可能更喜欢这样的标准排序函数。将$a和$b的相关部分分别提取到$aa和$bb中,并对它们进行简单比较
use strict;
use warnings 'all';
use feature 'say';
chomp( my @data = <DATA> );
say for sort {
my ($aa, $bb) = map { /TXT_([A-Z]+)_SLA/ } $a, $b;
$aa cmp $bb;
} @data;
__DATA__
20160311_TXT_XPL_SLA_Attribution
20160301_TXT_APL_SLA_Attribution
20160301_TXT_XPL_SLA_Attribution
20160302_TXT_APL_SLA_Attribution输出
20160301_TXT_APL_SLA_Attribution
20160302_TXT_APL_SLA_Attribution
20160311_TXT_XPL_SLA_Attribution
20160301_TXT_XPL_SLA_Attribution发布于 2016-03-12 05:54:03
来自sort的文档
如果省略SUBNAME或BLOCK,则按标准字符串比较顺序排序。
所以下面的代码
sort
map { /TXT(.*)PLA/; [$1, $_] }
@files;按字符串化的值(类似于ARRAY(0x22bcd48))对从map返回的arrayref值进行排序。下面的代码应该根据arrayrefs的第一个元素对它们进行排序:
sort { $a->[0] cmp $b->[0] }
map { /TXT(.*)PLA/; [$1, $_] }
@files;https://stackoverflow.com/questions/35950353
复制相似问题