看起来你正在尝试对版本号进行排序,其中每个组件是独立排序的。Sort::Naturally无法工作,因为它忽略非字母数字字符,但是还有其他几个模块可以做到这一点。
Sort::Versions将其输入拆分为句点或连字符,并根据是否存在非数字字符对每个组进行字母表或数字排序:
use strict;
use warnings 'all';
use 5.010;
use Sort::Versions;
my @versions = (
15.12,
16.1,
15.2,
15.1
);
say for sort { versioncmp($a, $b) } @versions;
输出:
15.1
15.2
15.12
16.1
Sort::Versions期望输入与某些常见版本字符串格式匹配;如果您需要对不同于您所显示的格式进行排序,请检查文档中的规则以确保它适用于您。
Sort::Key::Natural 更加灵活,因为它会在所有单词边界上进行分割,而不仅仅是句点和连字符,但在这种情况下它的作用相同:
use strict;
use warnings 'all';
use 5.010;
use Sort::Key::Natural qw(natsort);
my @versions = (
15.12,
16.1,
15.2,
15.1
);
say for natsort @versions;
(输出与Sort::Versions相同)
Sort::Key::Natural具有一些不错的附加功能,例如能够就地排序和自定义排序顺序。在我的基准测试中,它比Sort::Versions快得多,尽管只有在对大型数组进行排序时才会有所影响。