我正在尝试编写一个实现自己的自定义排序的perl脚本.如果输入文件如下所示:
hello
advantage
cat
Run Code Online (Sandbox Code Playgroud)
排序版本看起来像:
cat
hello
advantage
Run Code Online (Sandbox Code Playgroud)
如果单词按长度排序,如果两个单词的长度相同,那么它就会对两者进行正常的词典比较.
基于我在网上看到的东西,我的排序行看起来像这样:
@sorted = sort { length $a <=> length $b } @elements
Run Code Online (Sandbox Code Playgroud)
但我不确定如果两个单词的长度相同,我会如何添加正常排序的部分.
有效的方式sort是 - 它根据比较进行位置排序.如果sort函数是负数,则为零或正数.
这就是<=>运算符对数字的作用,而cmp运算符使用字符串.
所以它会工作得很好:
print 2 <=> 3,"\n";
print 3 <=> 3,"\n";
print 3 <=> 2,"\n";
Run Code Online (Sandbox Code Playgroud)
等长将比较,返回零,因此sort将知道它们是相等的.实际上,这确实意味着排序可能是随机的 - 就所sort关注的而言,它们是相等的.
因此,如果您想实现二级排序,实际上非常简单,这要归功于||运营商.因为它所做的是测试前面语句的"真实性" - 如果它"不是真的" - 在这种情况下0- 它被评估并且可能返回结果.
所以你可以:
print 0 || "fish","\n";
Run Code Online (Sandbox Code Playgroud)
或者更好的是:
print 3 <=> 3 || "fish", "\n";
print 3 <=> 2 || "fish", "\n";
Run Code Online (Sandbox Code Playgroud)
所以要回答你的问题 - 如果你想按长度排序,然后按字符串排序:
my @sorted = sort { length $a <=> length $b
|| $a cmp $b } @elements
Run Code Online (Sandbox Code Playgroud)