مرتبسازی پیشرفته
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 بین دو مقایسه = مرتبسازی چندسطحی! اگر اولی برابر بود (۰)، دومی تصمیم میگیرد.
خلاصه
- sort { $a <=> $b } عددی صعودی
- sort { $b <=> $a } عددی نزولی
- مرتبسازی هش: sort { $h{$a} cmp $h{$b} } keys %h
- or برای چندسطحی
این مبحث بخشی از دوره آموزش کامل پرل است.