商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Perl数组排序学习笔记

Perl数组排序学习笔记

  发布于2026-06-29 阅读(0)

扫一扫,手机访问

自然引入,主章节使用

,子章节使用

,整体读起来像资深技术博主的手笔。 ```html

今天我们来聊聊Perl中数组排序这件事。sort函数是Perl自带的利器,直接传一个数组进去,它就能返回排好序的新数组——比如@sorted = sort @original,简单粗暴。但如果你以为它总是按你想象的顺序来排,那可就容易踩坑了。下面从头说透。

Perl数组排序学习笔记

基于ASCII码排序

先看一个最基础的例子:

#!/usr/bin/perl
use strict;
use warnings;
use 5.010;

use Data::Dumper qw(Dumper);

my @words = qw(foo bar zorg moo);

say Dumper @words;

my @sorted_words = sort @words;

say Dumper @sorted_words;

运行结果:

$VAR1 = [
        'foo',
        'bar',
        'zorg',
        'moo'
      ];

$VAR1 = [
        'bar',
        'foo',
        'moo',
        'zorg'
      ];

第一个输出是排序前的数组,第二个是sort之后的结果——按字母顺序排好了,看起来挺正常。

但问题来了:如果数组里混有大写字母呢?

my @words = qw(foo bar Zorg moo);

排序结果会变成:

$VAR1 = [
        'Zorg',
        'bar',
        'foo',
        'moo'
      ];

看到没?大写开头的“Zorg”被排到了所有小写单词前面。这是因为sort默认按照ASCII码表进行比较——大写字母的码值全都小于小写字母,所以“Z”排在“b”前头。这往往不是我们想要的。

比较函数

sort到底是怎么工作的?它会遍历原始数组,每次取相邻的两个元素,分别放入$a$b,然后调用一个比较函数。这个函数需要返回三个值之一:如果$a应该排在$b左边,就返回1;如果$b应该在左边,就返回-1;两者相等则返回0。

默认情况你不需要写这个函数,sort直接用cmp操作符进行比较。当然你也可以显式写出来:

sort { $a cmp $b } @words;

效果和不写块完全一样。cmp负责字符串比较:左边小于右边返回1,大于返回-1,相等返回0。这就是默认行为的核心。

按字母顺序排列

如果我们想忽略大小写进行排序(也就是真正的字母顺序),很简单——把所有字符串转成小写再比较:

my @sorted_words = sort { lc($a) cmp lc($b) } @words;

lc函数返回参数的小写形式,然后cmp比较这些小写版本,最后决定原始字符串的顺序。结果就会是:

$VAR1 = [
        'bar',
        'foo',
        'moo',
        'Zorg'
      ];

这下“Zorg”乖乖排到末尾了。

Perl对数值排序

如果你把数字当作字符串传进去,默认排序会闹笑话:

my @numbers = (14, 3, 12, 2, 23);
my @sorted_numbers = sort @numbers;
say Dumper @sorted_numbers;

输出:

$VAR1 = [
        12,
        14,
        2,
        23,
        3
      ];

12排在2前面?仔细一想其实不奇怪:sort按字符串比较,第一个字符'1'的ASCII码小于'2',所以"12"被当作字符串排在"2"前面。Perl不会自动猜到你想按数字排序。

解决办法是用<=>操作符(人称“太空船操作符”),它专门用来做数值比较,同样返回1、-1或0:

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

结果:

$VAR1 = [
        2,
        3,
        12,
        14,
        23
      ];

这下就对了。记住:字符串排序用cmp,数值排序用<=>,如果你需要降序,把$a$b调换位置即可。

一句话总结:sort是Perl里最实用的工具之一,但它的默认行为基于ASCII,别被它“聪明”的反直觉排序坑到。带着比较函数写清楚排序规则,一切尽在掌握。

本文转载于:https://www.jb51.net/article/67430.htm 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

产品推荐

热门关注