为什么版本排序顺序是相反的?

3
我有以下代码来对版本号进行排序:
chomp(my @versions = <>);  
my @sorted_versions = sort {  
                        version->parse( $a ) cmp version->parse( $b )
                    } @versions;  
print "$_\n" for @sorted_versions;  

如果我将以下文件进行管道传输:
cat version_file   
15.8  
15.8.1  

输出是:
15.8.1  
15.8  

为什么?本应该是这样的:
15.8  
15.8.1  

我已经检查过脚本运行时cmp返回1的情况。


2
cmp 在左参大于右参时返回 1。问题是否在 version->parse 函数内部? - bipll
2
我认为问题在于 15.8 被解释为 15.800000,而 15.8.1 被解释为 15.008001。你应该将 15.8 转换为更现代的格式:15.8.0 - Håkon Hægland
@HåkonHægland:难道没有不改变版本格式就能实现我想要的功能的方法吗? - Jim
1
@Jim 可能吧。但是为什么不在 sort 之前循环遍历 @versions 并修复它呢? - Håkon Hægland
@Jim 我不确定它会变得复杂,但无论如何,如果这是问题,你不需要预处理列表。你还可以定义一个子例程,例如 sub fixup { $_[0] =~ s/^[^.]*\.[^.]*\K$/.0/r },然后在 sort 子例程中执行 version->parse( fixup($a) ) cmp version->parse( fixup($b) ) - Håkon Hægland
显示剩余3条评论
2个回答

4
version的文档中有这段话:

点分十进制表示:裸的v-strings(v1.2.3)和带有一个以上小数点以及前导“v”的字符串(“v1.2.3”);注意,你可以在v-string或仅有一个小数点和前导v的字符串中使用(v1.2或“v1.2”),但是这会让你和其他人都感到困惑。

问题在于 15.8 被解析为 v5.800.0,而 15.8.1 变成了 v15.8.1
你可以在version::Internals中阅读更多相关内容。

但这不是我拥有的版本。唯一的选择是对15.8进行预处理,使其变为15.8.0吗? - Jim

0

你只需要在版本号前面加上一个 v

chomp(my @versions = <>);
my @sorted_versions = sort {
    version->parse( "v$a" ) cmp version->parse( "v$b" )
} @versions;
print "$_\n" for @sorted_versions;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接