perl sort
来源:互联网 发布:移动硬盘 分区软件 编辑:程序博客网 时间:2024/05/22 07:00
sort
- sort SUBNAME LIST
- sort BLOCK LIST
- sort LIST
In list context, this sorts the LIST and returns the sorted list value. In scalar context, the behaviour of
sort()
is undefined.If SUBNAME or BLOCK is omitted,
sort
s in standard string comparison order. If SUBNAME is specified, it gives the name of a subroutine that returns an integer less than, equal to, or greater than0
, depending on how the elements of the list are to be ordered. (The<=>
andcmp
operators are extremely useful in such routines.) SUBNAME may be a scalar variable name (unsubscripted), in which case the value provides the name of (or a reference to) the actual subroutine to use. In place of a SUBNAME, you can provide a BLOCK as an anonymous, in-line sort subroutine.If the subroutine's prototype is
($$)
, the elements to be compared are passed by reference in@_
, as for a normal subroutine. This is slower than unprototyped subroutines, where the elements to be compared are passed into the subroutine as the package global variables $a and $b (see example below). Note that in the latter case, it is usually highly counter-productive to declare $a and $b as lexicals.The values to be compared are always passed by reference and should not be modified.
You also cannot exit out of the sort block or subroutine using any of the loop control operators described inperlsyn or with
goto
.When
use locale
is in effect,sort LIST
sorts LIST according to the current collation locale. See perllocale.sort() returns aliases into the original list, much as a for loop's index variable aliases the list elements. That is, modifying an element of a list returned by sort() (for example, in a
foreach
,map
orgrep
) actually modifies the element in the original list. This is usually something to be avoided when writing clear code.Perl 5.6 and earlier used a quicksort algorithm to implement sort. That algorithm was not stable, so could go quadratic. (A stable sort preserves the input order of elements that compare equal. Although quicksort's run time is O(NlogN) when averaged over all arrays of length N, the time can be O(N**2), quadratic behavior, for some inputs.) In 5.7, the quicksort implementation was replaced with a stable mergesort algorithm whose worst-case behavior is O(NlogN). But benchmarks indicated that for some inputs, on some platforms, the original quicksort was faster. 5.8 has a sort pragma for limited control of the sort. Its rather blunt control of the underlying algorithm may not persist into future Perls, but the ability to characterize the input or output in implementation independent ways quite probably will. See the sort pragma.
Examples:
- # sort lexically
- @articles = sort @files;
- # same thing, but with explicit sort routine
- @articles = sort {$a cmp $b} @files;
- # now case-insensitively
- @articles = sort {uc($a) cmp uc($b)} @files;
- # same thing in reversed order
- @articles = sort {$b cmp $a} @files;
- # sort numerically ascending
- @articles = sort {$a <=> $b} @files;
- # sort numerically descending
- @articles = sort {$b <=> $a} @files;
- # this sorts the %age hash by value instead of key
- # using an in-line function
- @eldest = sort { $age{$b} <=> $age{$a} } keys %age;
- # sort using explicit subroutine name
- sub byage {
- $age{$a} <=> $age{$b}; # presuming numeric
- }
- @sortedclass = sort byage @class;
- sub backwards { $b cmp $a }
- @harry = qw(dog cat x Cain Abel);
- @george = qw(gone chased yz Punished Axed);
- print sort @harry;
- # prints AbelCaincatdogx
- print sort backwards @harry;
- # prints xdogcatCainAbel
- print sort @george, 'to', @harry;
- # prints AbelAxedCainPunishedcatchaseddoggonetoxyz
- # inefficiently sort by descending numeric compare using
- # the first integer after the first = sign, or the
- # whole record case-insensitively otherwise
- my @new = sort {
- ($b =~ /=(\d+)/)[0] <=> ($a =~ /=(\d+)/)[0]
- ||
- uc($a) cmp uc($b)
- } @old;
- # same thing, but much more efficiently;
- # we'll build auxiliary indices instead
- # for speed
- my @nums = @caps = ();
- for (@old) {
- push @nums, ( /=(\d+)/ ? $1 : undef );
- push @caps, uc($_);
- }
- my @new = @old[ sort {
- $nums[$b] <=> $nums[$a]
- ||
- $caps[$a] cmp $caps[$b]
- } 0..$#old
- ];
- # same thing, but without any temps
- @new = map { $_->[0] }
- sort { $b->[1] <=> $a->[1]
- ||
- $a->[2] cmp $b->[2]
- } map { [$_, /=(\d+)/, uc($_)] } @old;
- # using a prototype allows you to use any comparison subroutine
- # as a sort subroutine (including other package's subroutines)
- package other;
- sub backwards ($$) { $_[1] cmp $_[0]; } # $a and $b are not set here
- package main;
- @new = sort other::backwards @old;
- # guarantee stability, regardless of algorithm
- use sort 'stable';
- @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
- # force use of mergesort (not portable outside Perl 5.8)
- use sort '_mergesort'; # note discouraging _
- @new = sort { substr($a, 3, 5) cmp substr($b, 3, 5) } @old;
Warning: syntactical care is required when sorting the list returned from a function. If you want to sort the list returned by the function call
find_records(@key)
, you can use:- @contact = sort { $a cmp $b } find_records @key;
- @contact = sort +find_records(@key);
- @contact = sort &find_records(@key);
- @contact = sort(find_records(@key));
If instead you want to sort the array @key with the comparison routine
find_records()
then you can use:- @contact = sort { find_records() } @key;
- @contact = sort find_records(@key);
- @contact = sort(find_records @key);
- @contact = sort(find_records (@key));
If you're using strict, you must not declare $a and $b as lexicals. They are package globals. That means that if you're in the
main
package and type- @articles = sort {$b <=> $a} @files;
then
$a
and$b
are$main::a
and$main::b
(or$::a
and$::b
), but if you're in theFooPack
package, it's the same as typing- @articles = sort {$FooPack::b <=> $FooPack::a} @files;
The comparison function is required to behave. If it returns inconsistent results (sometimes saying
$x[1]
is less than$x[2]
and sometimes saying the opposite, for example) the results are not well-defined.Because
<=>
returnsundef
when either operand isNaN
(not-a-number), and laso becausesort
raises an exception unless the result of a comparison is defined, be careful when sorting with a comparison function like$a <=> $b
any lists that might contain aNaN
. The following example takes advantage thatNaN != NaN
to eliminate anyNaN
s from the input list.- @result = sort { $a <=> $b } grep { $_ == $_ } @input;
- perl sort
- Perl Sort
- perl方法:sort函数
- 简简单单讲sort--perl
- perl sort 函数
- 3 Perl - 列表 - sort 操作
- Perl学习笔记之Sort
- perl sort函数的用法
- Perl技巧 sort函数使用
- perl从sort到施瓦茨变换
- perl中grep,sort,map用法总结
- perl中grep,sort,map用法总结
- perl中 sort map用法总结
- perl方法:sort函数 (转载)
- 关于perl中sort的用法举例
- Perl Sort函数的用法 (转载)
- perl方法:sort函数-grueclan的专栏
- 安装perl模块和sort命令
- 安馨园集团表示愿意接手 把浐灞队留在西安
- Windows下Djang+Wsgi+Apache配置,各种该相关配置问题的终极解决方案
- Sql批量建表、删表,表名以数字命名,且固定长度
- 第11章 使用正则表达式的模式匹配(二)
- 随滚动条移动的层
- perl sort
- 开始Flex Builder 3
- java 浅复制和深复制
- 常见域名后缀词典
- Asp.net中DataBinder.Eval用法的总结
- LPTSTR、LPCSTR、LPCTSTR、LPSTR的意义
- 多种还原.bak数据库文件方式-Mssql数据库教程
- 掉电保护设计
- instanceof