首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Perl对国会库(LCC)数字进行排序?

如何使用Perl对国会库(LCC)数字进行排序?
EN

Stack Overflow用户
提问于 2016-04-15 04:17:02
回答 2查看 103关注 0票数 1

假设我有这些国会图书馆(LCC)编号:

代码语言:javascript
复制
BX2230.3
BX2237
BX2380 .R67 2002 
BX932 .C53 1993

使用sortsort -b来忽略Linux上的空格,它们的顺序如下:

代码语言:javascript
复制
BX2230.3
BX2237
BX2380 .R67 2002 
BX932 .C53 1993

然而,他们应该像这样下命令:

代码语言:javascript
复制
BX932 .C53 1993
BX2230.3
BX2237
BX2380 .R67 2002 

有什么方法可以用sortperl来做到这一点?单词顺序:按字母顺序排列每一行的前两个字符,前两个字符后面的数字,“”之后的字母。(如果它存在的话)按字母顺序排列,数字后面的数字呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-15 04:59:26

有一个模块Library::CallNumber::LC,特别是为此目的。它有一个normalize方法,可以将LCN转换为可直接排序的东西。它会将您的数字列表更改为

代码语言:javascript
复制
BX22303
BX2237
BX2380 R67  02002
BX0932 C53  01993

这样你就可以像这样整理你的号码

代码语言:javascript
复制
use strict;
use warnings 'all';

use Library::CallNumber::LC;

my @numbers = (
    'BX2230.3',
    'BX2237',
    'BX2380 .R67 2002',
    'BX932 .C53 1993',
);

print "$_\n" for sort {
    my ($aa, $bb) = map { Library::CallNumber::LC->normalize($_) } ($a, $b);
    $aa cmp $bb;
} @numbers;

输出

代码语言:javascript
复制
BX932 .C53 1993
BX2230.3
BX2237
BX2380 .R67 2002
票数 4
EN

Stack Overflow用户

发布于 2016-04-15 04:52:15

简单地试试这个

$a$b为排序反向关键字。你想要选择特定的单词,并与这些词排序。因此,使用map并将单词存储在$adup$bdup中,并按$adup$bdup变量执行排序。

代码语言:javascript
复制
open my $fh ,"<", "file.txt" or die"$! error opening";
my @ar = <$fh>;
my @sort = sort{ my ($adup, $bdup) = map /^\D+(\d+)/, $a, $b; $adup <=> $bdup } @ar;
print @sort;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36638173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档