Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort function in Perl

Tags:

perl

Consider:

use warnings;

my @a = (1, 11, 3, 5, 21, 9, 10);

my @b = sort @a;

print "@b";

Output: 1 10 11 21 3 5 9

Codepad link: http://codepad.org/Fvhcf3eP

I guess the sort function is not taking the array's elements as an integer. That is why the output is not:

1 3 5 9 10 11 21

Is it?

How can I get the above result as output?

like image 880
Chankey Pathak Avatar asked Nov 26 '22 23:11

Chankey Pathak


2 Answers

The default implementation of Perl's sort function is to sort values as strings. To perform numerical sorting:

my @a = sort {$a <=> $b} @b;

The linked page shows other examples of how to sort case-insensitively, in reverse order (descending), and so on.

You can create explicit subroutines to prevent duplication:

sub byord { $a <=> $b };
...
@a = sort byord @b;

This is functionally equivalent to the first example using an anonymous subroutine.

like image 135
Quick Joe Smith Avatar answered Nov 29 '22 13:11

Quick Joe Smith


You are correct. So just tell Perl to treat it as an integer like below.

File foop.pl

use warnings;

my @a = (1, 11, 3, 5, 21, 9, 10);

my @b = sort {$a <=> $b} @a;

print "@b";

Run

perl foop.pl
1 3 5 9 10 11 21
like image 29
Gidon Wise Avatar answered Nov 29 '22 11:11

Gidon Wise