我需要那些比我更有经验的人的Perl智慧。
到目前为止,我对以下内容的回答是简单地逐行浏览文件,并将相关元素插入到数组中,对数组进行排序,然后附加内容。但这似乎有点啰嗦,而且效率不高。
我有一个文件,其内容如下所示:
Set objFSO = CreateObject("Scripting.FileSystemObject")
strFolder = objFSO.GetParentFolderName(WScript.ScriptFullName)
Perl中是否有一种聪明的方法(理想情况下可以通过管道进行单行程)来排序第二个列表?即所以你会得到以下结果:
# A Comment
# Another comment
:127.100.100.255:Something
.789
.123
.456
:127.200.200.100:Something Else
.bravo.example.com # <----
noperiod.example.com # <---- This list is
.an.example.com # <---- not ordered
.some.example.com # <----
有四点需要注意:
答案 0 :(得分:2)
取决于你的意思和效率&#39;。我的意思是,一个班轮很少高效,它也很少简洁或清楚它做了什么。
但就效率而言?嗯,这取决于你已经做的那些效率低下的事情。我的意思是,从根本上说,如果你要对某些东西进行排序,你需要检查整个数据集。否则你怎么知道文件中的最后一行需要排序到顶部?
但是对于你正在做的事情,我会这样做:
#!/usr/bin/perl
use strict;
use warnings;
sub sort_noperiods {
my $a_np = $a;
$a_np =~ s/\.//g;
my $b_np = $b;
$b_np =~ s/\.//g;
return $a_np cmp $b_np;
}
while ( <> ) {
print;
last if m/Something Else/;
}
print sort sort_noperiods <>;
对于您的样本输入,打印:
# A Comment
# Another comment
:127.100.100.255:Something
.789
.123
.456
:127.200.200.100:Something Else
.an.example.com # <---- not ordered
.bravo.example.com # <----
noperiod.example.com # <---- This list is
.some.example.com # <----
我正在关注“其他东西”。你文件中的一行,因为我无法确定你如何识别标题的最后一行&#39;块。根据&#39; noperiods&#39;以及其他任何内容进行读入和排序。排序机制。 (通过缓存正则表达式的结果可能会有很小的效率提升,但我对此并不确定)。
这可以是单线化的&#39;由:
perl -e 'while ( <> ) { print; last if m/Something Else/ }; print sort { $a =~ s/\.//gr cmp $b =~ s/\.//gr } <>; '
答案 1 :(得分:1)
您可以通过shell在Perl的帮助下对其进行排序:只需在列表之前为每行添加行号,对于列表,使用其第一行的编号。然后按数字进行数字排序,然后按行的其余部分进行排序:
call FileTimeFilterJS.bat "." -filetime modified -direction after -dd -3