自定义在perl中对文件进行排序

The*_*ign 0 sorting perl file

我正在尝试编写一个实现自己的自定义排序的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)

但我不确定如果两个单词的长度相同,我会如何添加正常排序的部分.

Sob*_*que 6

有效的方式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)