Perl基本数组排序方法介绍(perl数组添加元素)这都可以?

随心笔谈2年前发布 admin
224 0 0

文章摘要

这篇文章介绍了如何使用Perl语言的`sort`函数对字符串和数字数组进行排序。以下是文章的主要内容总结: 1. **字符串排序** - Perl的`sort`函数默认基于ASCII码对字符串进行排序。这种排序方式将大写字母排在小写字母之前。 - 例如,排序后的结果可能会将以大写字母开头的字符串放在前面。 2. **比较函数的使用** - 如果需要自定义排序方式,可以使用比较函数。默认情况下,`sort`使用`cmp`函数进行比较,可以使用块或表达式来显式定义比较规则。 - 例如,通过`sort { lc($a) cmp lc($b) }`可以实现忽略大小写的字母序排序。 3. **数字排序** - 对数字数组使用默认的`sort`函数时,默认是比较字符串值,而不是数字值。这会导致数字的排序结果不符合预期。 - 例如,数字数组`(14, 3, 12, 2, 23)`按字符串排序后会变成`(12, 14, 2, 23, 3)`。 4. **数字排序解决方案** - 要按数字值对数组进行排序,可以使用`<=>`运算符或`cmp`函数进行比较。 - 例如,使用`sort { $a <=> $b }`可以正确地将数字数组排序为`(2, 3, 12, 14, 23)`。 文章强调了在使用`sort`函数时需要根据具体需求选择适当的比较方式,以实现期望的排序结果。



本文我们学习如何用Perl对字符串或者数字数组进行排序。

Perl有个内置函数叫做sort毫无疑问的可以排序一个数组。 其最简单的形式是传递一个数组,它会返回排序后的元素组成的数组。@sorted=sort @original。

基于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’

      ];

第一个输出显示了排序前的数组,第二个是排序后的。

这是最简单的情形,但是可能未必是你想要的。 比如,如果一些单词以大写字母开头怎么办?

复制代码 代码如下:

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

@sorted_names里的结果将是:

复制代码 代码如下:

$VAR1=[

        ‘Zorg’,

        ‘bar’,

        ‘foo’,

        ‘moo’

      ];

你会发现,以大写字母开头的单词排在了第一位。 这是因为sort默认根据ASCII码表排序,所有的大写字母都排在小写字母前边。

比较函数

Perl的sort的工作方式是这样的,它遍历原始数组的每两个元素;每次把左边的值放入变量$a,把右边的值放入变量$b。 然后调用比较函数。如果$a的内容应该在左边的话,“比较函数”会返回1;如果$b应该在左边的话,返回-1,两者一样的话,返回0。

通常你看不到比较函数,sort会根据ASCII码表对值进行比较,不过如果你想的话,你可以显式的写出来:

复制代码 代码如下:

sort { $a cmp $b } @words;

这段代码会跟没有使用块的sort @words达到同样的效果。

这里你可以看到,默认perl使用cmp作为比较函数。这是因为正是cmp可以做这里边我们需要的工作。 它比较两边的字符串的值,如果左边参数“小于”右边参数,就返回1;如果左边参数“大于”右边参数,就返回-1;如果相等,就返回0。

按字母顺序排列

如果你想忽略字符串的大小写来排序——即通常所谓的字母序,你可以像下一个例子这么做:

复制代码 代码如下:

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

这里为了比较,我们调用lc函数返回参数的小写版本。然后cmp比较这些小写版本并决定原始字符串谁先谁后。

结果是

复制代码 代码如下:

$VAR1=[

        ‘bar’,

        ‘foo’,

        ‘moo’,

        ‘Zorg’

      ];

Perl对数值排序

如果对数值数组使用sort进行默认的排序,结果可能不是我们期望的。

复制代码 代码如下:

my @numbers=(14, 3, 12, 2, 23);

my @sorted_numbers=sort @numbers;

say Dumper \@sorted_numbers;

$VAR1=[

        12,

        14,

        2,

        23,

        3

      ];

仔细一想的话,这并不奇怪。比较函数看到12和3时,它按字符串进行比较。这意味着比较两个字符串的第一个字符”1″和”3″。 在ASCII码表里,”1″在”3″前边,因此字符串”12″会排在字符串”3″前面。

Perl不会很神奇地猜到你想按数字对这些值排序。

尽管我们可以写一个比较函数来按数字比较两个值。但这里我们使用<=>(也被称作宇宙飞船操作符), 它会按数字来比较两个参数并返回1、-1或者0。

复制代码 代码如下:

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

结果是:

复制代码 代码如下:

$VAR1=[

        2,

        3,

        12,

        14,

        23

      ];

© 版权声明

相关文章