按perl中的第二个单词排序

Pur*_*nce 1 sorting perl

嘿伙计们,我有这个名为电话簿的文件

Steve Blenheim:239-923-7366:238-934-7865:95 Latham Lane, Easton, PA 83755:11/12/56:20300
Betty Boop:245-836-8357:245-876-7656:635 Cutesy Lane, Hollywood, CA 91464:6/23/23:14500
Igor Chevsky:385-375-8395:385-333-8976:3567 Populus Place, Caldwell, NJ 23875:6/18/68:23400
Norma Corder:397-857-2735:397-857-7651:74 Pine Street, Dearborn, MI 23874:3/28/45:245700
Run Code Online (Sandbox Code Playgroud)

我试图从第二个单词(姓氏)按反向字母顺序对文本进行排序,但却无法找到如何进行排序.我这样做是从文件中读取的

  open (FILE, phonebook);
  @line = <FILE>;
  close(FILE);
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?我可以按字母顺序排序第一个字段并反转,但似乎无法让第二个字段正确排序.提前致谢

hob*_*bbs 10

我同意tadmc的担心,第二个字段,由空格并不总是姓氏,但回答问题,因为它属于第二个字段,你可以使用它split,你可以这样排序:

简单但非常慢的版本(易于阅读,但每次比较两行时重新分割每个字段,这是低效的).

@lines = sort { # Compare second fields
    (split " ", $a)[1]
    cmp
    (split " ", $b)[1]
} @lines;
Run Code Online (Sandbox Code Playgroud)

使用Schwartzian变换版本(不完全一样的事情与前一个,只有更快):

@lines = map { # Get original line back
    $_->[0]
} sort { # Compare second fields
    $a->[1] cmp $b->[1]
} map { # Turn each line into [original line, second field]
    [ $_, (split " ", $_)[1] ]
} @lines;
Run Code Online (Sandbox Code Playgroud)