2013-01-22 53 views
-1

我試圖從排序文件中的字母A到Z 例如:a AB DRG 排序:A A B DGRPERL:排序從A字母A到Z

@ARGV == 2 or die "Usage: $0 infile outfile\n"; 
open $old, '<', $ARGV[0] or die $!; 
open $new, '>', $ARGV[1] or die $!; 
@mass=<$old>; 
@array=qw(@mass); 
@sort=sort @array; 
@mass1=sort {uc $a cmp uc $b} @sort; 
print $new @mass1; 

我要去哪裏錯誤?

+0

你想對信件或文字進行分類嗎?你的輸入文件包含什麼內容?像「A B d r g」這樣的東西?如果是這樣,它包含多行? – Faiz

+0

我有一個包含文字和字母的文件,所以我必須按字母排序 – PYPL

+0

因此'ba ab a'應該像'a ab ba'一樣變成? – Faiz

回答

2

我不確定您打算如何處理qw,但 就足以說明將不會使用@mass的內容。

@array = qw(hello world); 

會造成@array被定義爲包含2個helloworld。這是剛剛簡寫:

@array = ('hello', 'world'); 

這就是爲什麼

@array=qw(@mass); 

則計算結果爲('@mass') - 用5個字符@mass單一的文字字符串數組。

也許這就是你做錯了。如果您嘗試

@array = map { split /\s+/} @mass; 

@mass是行列表。每行有空格分隔的單詞或只是字母。這將每個 線像'ba ab a G'分成列表('ba', 'ab', 'a', 'G')@array將 成爲字/字母一個列表 - 什麼最後一行所做的就是以split /\s+/每一行映射。

然後,這是一個你想如何排序的問題。另請參閱其他答案。

哦,記得把後面的空間,當你寫出你的文件:

print $new (join " ", @mass1); 

如果你想在每行被相互依賴對方的排序,這是一件容易的事:

$mass1 = join "\n", map { join " ", sort (split /\s+/) } @mass 

這表示'對於@mass中的每一行,在空間上分割,按空格重新排序並返回',並使用結果數組加入newline以產生文件的輸出。

注意,您可以在sort用比較喜歡滴等sort { $a cmp $b }

如果你的文件過大,則循環也許是謹慎的:

for my $mass (<$old>) { 
    my $sorted_line = join " ", sort (split /\s+/, $mass); 
    print $new "$sorted_line\n"; 
} 
+0

注意到它正在刪除所有行並將所有內容寫入1行 – PYPL

+0

您必須儘可能具體。如果你有多行文字,並且希望它們被排序,那麼你可以:(a)希望每行獨立排序;或者(b)希望將整個文件中的所有單詞排序爲一組。不是(b)意味着你會得到沒有行的輸出!所以我認爲你想要(a)不是(b)? – Faiz

+0

我想分類整個文件,所以也許可以通過循環文件來完成? – PYPL

3

我不認爲你明白標準文本排序是基於ASCII的。因爲所有大寫字母都是小寫字母,所以輸入也是如此。因此,您直接訂購sort將爲('A', 'B', 'a', 'd', 'g', 'r')

你想比較兩個字符串。在這種情況下,你將需要傳遞一個例程進行排序。

@sort= sort { lc $a cmp lc $b or $a cmp $b } @array; 
1

您需要找到正確的LOCALE才能使用,以便所有函數(排序等)使用的順序都使用正確的語言環境並對其進行相應排序。

請參閱this page showing most of the variables defining locales,然後查找LANG和LC_ALL。和LC_COLLATE(我不得不承認我不太確定哪個是在什麼時候使用的,LC_ALL應該優先於其他的,所以這是你可以改變所有LC_ *值設置...請測試,ymmv)

我相信你可能需要使用其中一個unicode語言環境。 Ascii不會做你想做的事情,因爲CAPS在ascii中定期發信之前。

要找出哪些區域設置可以使用:locale -a

要查看哪些區域設置您的當前設置爲:locale(用戶和系統範圍值是可能的)

你可能需要包含一些「UTF -8" 有你求

然後順序:(例如如果是en_US.UTF-8可):

只是用它的排序,確定要使用的語言環境排序前:

LC_ALL=en_US.UTF-8 

(或任何你需要它的設定,可如圖「區域設置-a」的值)

(保存/如果你需要恢復周圍調用先前的值)

在shell中,您可能最好希望對那些重新定義的變量進行「導出」,以確保子shell也使用新值(如:something | sort:在bash中,sort將位於子shell中,因此使用默認值LC_ *的值,或者如果導出它,則使用導出的值!)