如何在Perl中比较字母及其对应的(字母顺序)数字?

如何在Perl中比较字母及其对应的(字母顺序)数字?,perl,comparison,operator-overloading,versioning,Perl,Comparison,Operator Overloading,Versioning,我应该使用Perl比较一些应用程序的版本。问题是,每个版本的最后部分都可以通过数字和字母顺序对应的字母来设置,即: 12.3a == 12.31 12.3b == 12.32 12.3c <> 12.34 12.3a==12.31 12.3b==12.32 12.3c 12.34 我看到了,但它似乎只处理数字和下划线。 也许我应该用? 最好、最优雅的解决方案是什么?你看过David Wheeler的吗?这是一个奇怪的规范。正常化可能是一个方向 use version qw( qv

我应该使用Perl比较一些应用程序的版本。问题是,每个版本的最后部分都可以通过数字和字母顺序对应的字母来设置,即:

12.3a == 12.31
12.3b == 12.32
12.3c <> 12.34
12.3a==12.31
12.3b==12.32
12.3c 12.34
我看到了,但它似乎只处理数字和下划线。
也许我应该用?
最好、最优雅的解决方案是什么?

你看过David Wheeler的吗?

这是一个奇怪的规范。正常化可能是一个方向

use version qw( qv );

sub normalise_version {
    my ($v) = @_;
    $v =~ s/([a-i])/ ord($1)-ord('a')+1 /eg;
    return qv("v$v");
}

normalise_version($v1) <=> normalise_version($v2)
使用版本qw(qv);
亚正常化版本{
我的($v)=@;
$v=~s/([a-i])/ord($1)-ord('a')+1/eg;
返回qv(“v$v”);
}
标准化版本($v1)标准化版本($v2)
上述12.3被视为小于12.31。如果有错,请告诉我。

你可以试试。在模块说明中:

版本允许对混合的非数字和数字字符串进行轻松排序,如许多共享库系统和版本控制包使用的“版本号”。如果您正试图处理共享库,这是非常有用的。它还可以应用于在文本中散布可变宽度数字字段的应用程序。毫无疑问,还可以找到其他应用程序



嗯。。。先对要比较的字符串进行“规范化”(用数字替换结尾字母)怎么样?它是否总是一个字母,是否应该总是直接替换?例如,“a”到1,“b”到2等等?你会得到比“i”更高的字母吗?@raina77ow:它并不总是一个字母,但应该直接替换。此外,可能有很多字母,因此替换过程本身就相当复杂。@ikegami:可能有字母高于“i”,但不太可能。因此,仅针对低于“i”的字母的解决方案也很好。我的目的是:
12.3j
是否等同于任何东西?谢谢,不,我没有。但是我看不到在它的描述中用数字替换字母的选项,而且我更倾向于只使用标准模块。我认为它没有提供任何这样的功能,但它重载了比较,所以您可以进行:
SemVer->new(“12.3a”)new(“12.3c”)
比较。如果你真的只是想要数字转换,或者不需要CPAN的帮助,那么就用@ikegami的答案。这可能是你能得到的最好的了。我怀疑
SemVer->new(“12.3a”)==SemVer->new(“12.31”)
是真的。我也怀疑这一点,但如果这是你真正想要的,它似乎是一个相当蹩脚的规范。我无法想象在现实世界中会产生任何有用的版本号比较。当然,在现实世界中,如此多的版本号是任意的和非语义的,因此对它们进行全局比较是徒劳的。每个规则都需要一个例外。这就是为什么Perl模块需要使用可以转换为十进制形式的版本号,而不需要其他任何东西。编号
v5.6.1
转换为
5.006001
,但是
v5.6.1a
是什么?这是不允许的,而不是猜测。这是一个很好的策略,可以使CPAN安装工具在解决依赖性需求时发挥作用。实际上,因为我们正在处理的是12.3a版,可能是alpha版,应该小于12。3@Matteo是的,12.3a版本比12.3版本小,但在我的情况下,12.3a版等于12.31。@ikegami:谢谢,现在可以用了。但是你能不能把你的答案扩展一点,解释一下什么是
返回qv(“v$v”)会改变吗?@evgeny9,哪个更大,12.3还是12.31?通过使用一个版本对象,12.31被认为是更大的。谢谢,这个模块似乎做了正确的事情。但是,不幸的是,“not
lib
”模块对我来说是不可取的,因为生成的脚本应该可以在不同的PC(甚至几个Perl版本)之间移植,而无需额外的PPM安装。它是一个单独的模块,您可以与您的代码捆绑在一起,因为代码不到20行,您甚至可以嵌入它。谢谢,我从来没有捆绑或嵌入模块,所以我甚至没有想到这个选项。我试试看。