مرتب‌سازی پیشرفته

sort با بلوک سفارشی، <=> و cmp، مرتب‌سازی هش و ساختارهای پیچیده.

sort پیش‌فرض — رشته‌ای

my @words = qw(banana Apple cherry);
my @sorted = sort @words;      { Apple banana cherry }

sort عددی با <=>

sort پیش‌فرض رشته‌ای است! برای اعداد:
my @nums = (10, 2, 33, 4);
my @asc = sort { $a <=> $b } @nums;      { صعودی: 2 4 10 33 }
my @desc = sort { $b <=> $a } @nums;     { نزولی: 33 10 4 2 }
$a و $b متغیرهای جادویی sort هستند — پرل خودش مقدار می‌دهد. <=> عددی و cmp رشته‌ای مقایسه می‌کند.

sort نزولی رشته‌ای

my @words = qw(apple banana cherry);
my @desc = sort { $b cmp $a } @words;    { cherry banana apple }

مرتب‌سازی هش بر اساس مقدار

my %grades = (Ali => 18, Sara => 20, Reza => 15);

foreach my $name (sort { $grades{$b} <=> $grades{$a} } keys %grades) {
  say "$name: $grades{$name}";      { نزولی بر اساس نمره }
}

مرتب‌سازی بر اساس طول

my @words = qw(perl python c ruby javascript);
my @by_len = sort { length($a) <=> length($b) } @words;
say "@by_len";      { c perl ruby python javascript }

مرتب‌سازی ساختار پیچیده

my @students = (
  { name => "Ali",  score => 18 },
  { name => "Sara", score => 20 },
  { name => "Reza", score => 15 },
);

foreach my $s (sort { $b->{score} <=> $a->{score} } @students) {
  say "$s->{name}: $s->{score}";
}

مرتب‌سازی چندسطحی

{ اول بر اساس نمره، بعد بر اساس اسم }
sort {
  $b->{score} <=> $a->{score}
    or
  $a->{name} cmp $b->{name}
} @students;
or بین دو مقایسه = مرتب‌سازی چندسطحی! اگر اولی برابر بود (۰)، دومی تصمیم می‌گیرد.

خلاصه

این مبحث بخشی از دوره آموزش کامل پرل است.

ابزارهای مرتبط