2016-11-22 50 views
0

我想实现冒泡排序到我的剧本,让我整理我的数据字母。Perl的排序援助

**NetworkManager** Nov 8 13:24:23 osboxes <info> disable requested (sleeping: no enabled: yes) NetworkManager[1249]: 
**dhclient** Nov 8 15:52:45 osboxes DHCPOFFER of 192.168.253.129 from 192.168.253.254 dhclient: 
**dhclient** Nov 8 15:52:45 osboxes DHCPACK of 192.168.253.129 from 192.168.253.254 dhclient: 
**dnsmasq** Nov 13 17:52:35 osboxes using nameserver 192.168.253.2#53 dnsmasq[1637]: 

这就是文件的样子,所以读取文件,然后将其存储到数组中。

我希望能够用什么数据字母在开始进行排序(在**),所以输出应该是这样的:

**dhclient** Nov 8 15:52:45 osboxes DHCPOFFER of 192.168.253.129 from 192.168.253.254 dhclient: 
**dhclient** Nov 8 15:52:45 osboxes DHCPACK of 192.168.253.129 from 192.168.253.254 dhclient:  
**dnsmasq** Nov 13 17:52:35 osboxes using nameserver 192.168.253.2#53 dnsmasq[1637]: 
**NetworkManager** Nov 8 13:24:23 osboxes <info> disable requested (sleeping: no enabled: yes) NetworkManager[1249]: 
+5

为什么冒泡排序,而不是仅仅使用Perl的内置'sort'功能?你到目前为止有什么? – Tanktalus

+0

也许是因为任务这么说? :) – simbabque

+2

我认为@Tanktalus提出的问题是有效的。为什么不使用需要几乎零工作并且性能可能更好的解决方案? –

回答

2

没有理由实现冒泡排序对于这个问题(有没有?)。

my @new_array = sort @original_array; 

为了使排序不区分大小写:

my @new_array = sort {lc($a) cmp lc($b)} @original_array; 

如果你必须使用一个冒泡排序,this似乎是一个很好的参考,但例子是数字,而不是字符串数组。我将修改它在sort块使用字符串比较操作cmp,类似于上面。

sub bubble_sort { 
    for my $i (0 .. $#_){ 
     for my $j ($i + 1 .. $#_){ 
      my ($a,$b) = @_[$i, $j]; 

      # cmp returns -1 if the lefthand side is "less than" the right 
      if ((lc($a) cmp lc($b)) == 1) { 
       @_[$i, $j] = @_[$j, $i]; 
      } 
     } 
    } 
} 

bubble_sort(@array); 
print "$_\n" for @array; 
+0

此答案不会按示例输出中请求的顺序排序行。 –

+0

够正确。 OP首先声明他们需要字母顺序,传统上大写字母在小写之前。我没有注意到所需的输出已经大写字母后的字符串 – beasy

+1

这里没有足够的信息,但我怀疑OP希望排序不区分大小写。编辑了 – Tanktalus

-1

如何做到这一点的最好办法是

LC_ALL=C sort -f 

如果你坚持使用Perl:

use autodie; 
open my $fh, 'LC_ALL=C sort -f |'; 
print <$fh>; 

哦,你的意思是在Perl里面对它进行排序:

use feature qw(fc); 
print sort {fc $a cmp fc $b}, <>; 

或者更大的文件更高效:

use feature qw(fc); 
print map $_->[0], sort {$a->[1] cmp $b->[1]} map [$_, fc], <>; 

注意我不需要对**做任何事情,因为它们不会影响数据的输出顺序。

另外,请注意我不使用lcuc,因为它不能正常工作所有语言并且使用它们而不是fc是一种坏习惯。

+1

为什么这是一个坏习惯? – beasy

+0

@beasy:因为'uc'和'lc'都不是问题的答案,所以我怎么能忽略案例。答案既不是将其转换为大写,也不是将其转换为小写。答案是将其转换为大小写合并的表示形式,这正是“fc”所做的并且正确的做法。正确的做法是错误的做法是一个坏习惯。有关更多详细信息,请参阅'perldoc -f fc'。 –

+0

真正的答案似乎是'lc'和'uc'不适用于chars> 255。在ASCII范围内,转换为lc或lc将与casefolding同样。作为使用多种语言工作的人,thx指出这一点 – beasy