2016-11-22 21 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