Perl数组排序--sort()函数

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

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
      ];



此外,我们在网易云课堂上有各种教学视频,有兴趣可以了解一下:

1. 文章越来越难发?是你没发现新思路,基因家族分析发2-4分文章简单快速,学习链接:基因家族分析实操课程

2. 转录组数据理解不深入?图表看不懂?点击链接学习深入解读数据结果文件,学习链接:转录组(有参)结果解读转录组(无参)结果解读

3. 转录组数据深入挖掘技能-WGCNA,提升你的文章档次,学习链接:WGCNA-加权基因共表达网络分析

4. 转录组数据怎么挖掘?学习链接:转录组标准分析后的数据挖掘

5. 微生物16S/ITS/18S分析原理及结果解读

6. 更多学习内容:linux、perl、R语言画图,更多免费课程请点击以下链接:

https://study.omicsclass.com/

  • 发表于 2019-03-28 18:17
  • 阅读 ( 3761 )
  • 分类:perl

0 条评论

请先 登录 后评论
安生水
安生水

347 篇文章

作家榜 »

  1. omicsgene 698 文章
  2. 安生水 347 文章
  3. Daitoue 167 文章
  4. 生物女学霸 120 文章
  5. xun 81 文章
  6. 红橙子 78 文章
  7. rzx 74 文章
  8. CORNERSTONE 72 文章