2010-08-26 49 views
19
print "@_\n"; 
4109 4121 6823 12967 12971 14003 20186 

Làm thế nào để sắp xếp nó trong Perl?Làm thế nào để sắp xếp các số trong Perl?

Sử dụng @sorted = sort(@_); mang lại cho tôi một chữ cái đặt hàng

13041 13045 14003 20186 4109 4121 6823 

Làm thế nào để có được một trật tự số? Perl có các hàm dựng sẵn cho sắp xếp hợp nhất, chèn sắp xếp, v.v ... không?

+0

BTW, bạn có biết về lệnh perldoc không? –

+0

@eugene y: không, tôi không có. Tôi biết bây giờ. cảm ơn! – Lazer

Trả lời

42

Bạn có thể chuyển hàm so sánh tùy chỉnh cho thường trình sắp xếp của Perl. Chỉ cần sử dụng:

@sorted = sort { $a <=> $b } @unsorted; 

Chức năng so sánh tùy chỉnh làm đối số đầu tiên, dưới dạng khối mã. Phần {...} chỉ là khối mã này (xem http://perldoc.perl.org/functions/sort.html).

sort sẽ gọi hàm so sánh tùy chỉnh này bất cứ khi nào cần so sánh hai phần tử từ mảng cần sắp xếp. sort luôn vượt qua hai giá trị để so sánh dưới dạng $a, $b và hàm so sánh phải trả lại kết quả của so sánh. Trong trường hợp này, nó chỉ sử dụng toán tử để so sánh số (xem http://perldoc.perl.org/perlop.html#Equality-Operators), có thể được tạo ra chỉ dành cho mục đích này :-).

Giải pháp trơ trẽn bị đánh cắp từ "Perl Cookbook", Chương 04 Sub-chương 15 (mua sách - nó có giá trị nó)

+1

Tôi sẽ xóa liên kết đó, nó đang phân phối tài liệu có bản quyền mà không có sự đồng ý của chủ sở hữu. Bạn có thể giới thiệu tác phẩm gốc (Perl Cookbook, Christiansen và Torkington). –

+0

Dường như đó là sự đồng thuận về thẻ [Perl] liên kết tới các bản sao chép của sách O'Reilly (hoặc bất kỳ cuốn sách nào) là không hợp lệ. Chỉnh sửa để xóa – DVK

+0

Xin lỗi, không nhận ra liên kết đến tài liệu lậu. Cảm ơn bạn đã sửa chữa nó. – sleske

2

Bạn có thể xác định trước hàm sẽ được sử dụng để so sánh các giá trị trong mảng của bạn. perldoc -f sort mang đến cho bạn một ví dụ:

# sort using explicit subroutine name 
sub byage { 
    $age{$a} <=> $age{$b}; # presuming numeric 
} 
@sortedclass = sort byage @class; 

<=> điều hành được sử dụng để sắp xếp số lượng.

@sorted = sort {$a <=> $b} @unsorted; 
7

Perl's sort theo mặc định sắp xếp theo thứ tự bảng chữ cái theo thứ tự ASCII. Để sắp xếp số lượng bạn có thể sử dụng:

@sorted = sort { $a <=> $b } @_; 
+0

Tính năng này hoạt động như thế nào? – Lazer

+0

@Lazer: Xem giải thích của tôi (tôi đã gửi cùng một câu trả lời, chỉ sau đó một chút ;-)). – sleske

8

Cung cấp một chức năng so với sort():

# sort numerically ascending 
my @articles = sort {$a <=> $b} @files; 

# sort numerically descending 
my @articles = sort {$b <=> $a} @files; 

Chức năng sắp xếp mặc định là cmp, chuỗi so sánh, trong đó sẽ sắp xếp (1, 2, 10) vào (1, 10, 2). <=>, được sử dụng ở trên, là toán tử so sánh số.

4
@l = (4109, 4121, 6823, 12967, 12971, 14003, 20186, 1, 3, 4); 
@l = sort { $a <=> $b } @l; 
print "@l\n"; # 1 3 4 4109 4121 6823 12967 12971 14003 20186 

Bạn phải cung cấp phân loại chương trình con của riêng bạn { $a <=> $b }

0

Tôi chỉ muốn tiết kiệm rất nhiều thời gian cho bất cứ ai, mới trong Perl (như tôi), những người có câu hỏi này, tức là làm thế nào để sắp xếp một mảng số, vì Tôi không chỉ mất thời gian mà còn khiến tôi phát điên!

Vì vậy, bạn tìm thấy ở đây (và trong rất nhiều nơi khác) rằng cách để sắp xếp một mảng số là:

@sorted_array = sort { $a <=> $b } @unsorted_array; 

Bây giờ bạn thử nó, và bạn nhận được một lỗi: "Can not sử dụng "my $ a" trong so sánh sắp xếp "! (Điều này là do bạn đã khai báo '$ a', sử dụng 'strict.pm'). Nhưng sau đó, bạn không thể sử dụng các biến không được khai báo vì chúng sẽ bị từ chối là không xác định! Vì vậy, bạn có thể cảm thấy bị mắc kẹt trong một bế tắc, như tôi đã làm.

Tôi phải giải quyết vấn đề này "khó khăn", chỉ vì không ai quan tâm - hoặc ở đây, hoặc ở perldoc.perl.org, hoặc ở bất kỳ nơi nào khác mà tôi đã truy cập - đề cập đến '$ 'AND' $ b 'ĐƯỢC BẢO ĐẢM (TOKENS) ĐỂ SỬ DỤNG NÀY! (Điều này tất nhiên khi người ta sử dụng 'nghiêm ngặt', cái nào nên. Và điều đó khá điên rồ, bởi vì 'a' và 'b' nằm trong số các biến ngắn phổ biến nhất được sử dụng trong lập trình, và logic như vậy!)

I hy vọng rằng điều này sẽ giúp ích cho rất nhiều lập trình viên, mới trong Perl, người sẽ truy cập trang này!

Các vấn đề liên quan