• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

由浅入深谈Perl中的排序

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

主要内容:

1. 简单的使用sort排序

2. 对哈希按键排序

3. 对哈希按值排序

4. 对数组的数组排序

5. 使用Schwartzian Transform 排序

6. 对矩阵按多列排序

 

 

 

Perl中排序主要用sort函数,sort函数可以对列表按字母表顺序或者数值顺序进行排序,并返回排序好的列表,但是,请注意,sort不会改变原列表的值和顺序。sort函数进行排序用法如下:

 

sort   SUBNAME   LIST

 

sort   BLOCK      LIST

 

sort   LIST

 

下面会分别介绍sort排序的应用。

 

 

 

1. sort简单排序

 

如果只是简单地排序,直接使用上面用法的模式三即可。sort简单排序只会对列表内容按ASCII码排序。

 

【例】 my @arr = sort  qw(map  23  Perl  101  11  while  1  scalar  102);

 

   print “@arr\n”;

 

 

 

# output: 1  101  102  11  23  Perl  map  scalar  while

 

 

 

由于sort简单排序只能按alphabetical order排序,所以有时不能满足用户需求。为此,我们可以使用用法模式一和二。如用cmp<=>操作符等。

 

sort { $a <=> $b} @arr;  #对数组按数值升序排列

 

sort {$a cmp $b} @arr;  # 对数组值按字符比较顺序升序排列

 

 

 

2. 对哈希按键排序

 

【例】 

 

my %hash = (one => 1, two => 2, three => 3, four => 4);

 

#通常哈希不会按顺序输出没对键-值对,所以,要经过排序

 

foreach my $key (sort keys %hash){

 

print “$key: $hash{$key}\n”;

 

}

 

#It produces the following output:

 

four: 4

 

one: 1

 

three: 3

 

two: 2

 

 

 

3. 对哈希按值排序

 

仍然以上个hash为例:

 

【例】

 

foreach ( sort  { $hash{$a} <=> $hash{$b} }  keys %hash )

 

{

 

print  “$_:  $hash{$_}\n”;

 

}

 

 

 

 

 

 

 

4. 对数组的数组进行排序

 

这里主要说的是对子数组按数值或字母ASCII排序。

 

【例】 my @AOA = ([25,49,33,100], [145,87], [11, 85, 78]);

 

   foreach my $item1 ( @AOA ){

 

   foreach my $item2 ( sort { $b <=> $a } @{$item1} ){

 

print “$item2\t”;

 

  }

 

print “\n”;

 

}

 

#输出:

 

100 49 33 25

 

145 87

 

85 78 11

 

5. 使用Schwartzian Transform 排序

在讲Schwartzian Transform 排序前,咱先学习下面几个函数:

(1)  map函数:转换一个数组,即对一个数组的每个元素做block或者express里的运算,然后返回新的数组(详细介绍请查看后面章节)

这节我们讨论对二维数组的某一列进行排序,如下面的例子:

my $str = “ three 13 3 1 91 3

one 11 5 1 45 1

two 12 7 1 33 2

four 14 1 1 26 4”;

 

$str = join “ “,

    map { $_->[0]. “\n” }

    sort { $a->[1] <=> $b->[1] }

    map { [$_, (split)[-1]] }

    split  /\n/, $str;

print $str, “\n”;

① split /\n/, $str; 

此表达式对字符串$str进行分割,得到一个数组,含四个元素。然后该数组作为参数传递给上面的map函数。

② map { [$_, (split)[-1] ] } 

这里map对上一表达式传来的数组进行转换,参数保存到默认变量$_中;split没有加参数,所以也对默认变量$_按“ ”进行分割,由于split函数返回一个匿名数组,所以(split)[-1]表示分割后数组的最后一个元素。这样map 结果也是返回一个匿名数组,且该数组的每个元素也是一个包含两个元素$_ (split)[-1]的数组。然后传递给sort函数做排序处理。

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Perl]文字/代码批量替换工具[转]发布时间:2022-07-22
下一篇:
Perl多线程模块Parallel::ForkManager发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap