【问题标题】:Custom sort a file in perl在 perl 中自定义对文件进行排序
【发布时间】:2015-10-25 21:54:27
【问题描述】:

我正在尝试编写一个 perl 脚本来实现它自己的自定义排序。如果输入文件看起来像:

hello
advantage
cat

排序后的版本如下所示:

cat
hello
advantage

如果单词按长度排序,并且如果两个单词的长度相同,那么它将对两者进行正常的字典比较。

根据我在网上看到的情况,我的排序行如下所示:

@sorted = sort { length $a <=> length $b } @elements

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

【问题讨论】:

  • 你了解length $a &lt;=&gt; length $b 的工作原理吗?
  • 它根据比较权返回 1、0 或 -1
  • 对。所以,你必须检查 0 的情况:perldoc.perl.org/functions/sort.html

标签: perl file sorting


【解决方案1】:

sort 的工作方式是 - 它根据比较按位置排序。如果排序函数为负、零或正。

这就是&lt;=&gt; 运算符对数字的作用,cmp 运算符对字符串的作用。

所以它会正常工作:

print 2 <=> 3,"\n";
print 3 <=> 3,"\n";
print 3 <=> 2,"\n";

相等的长度会比较,返回零,所以sort 会知道它们是相等的。实际上,这确实意味着排序可能是随机的——就sort 而言,它们是相等的。

因此,如果您想实现二级排序,这实际上非常简单,这要感谢|| 运算符。因为 this 所做的是测试前面语句的“真相”——如果它是“不正确的”——在这种情况下0——它会被评估并且结果可能会被返回。

所以你可以:

print 0 || "fish","\n";

或者更好:

print 3 <=> 3 || "fish", "\n";
print 3 <=> 2 || "fish", "\n";

所以回答你的问题 - 如果你想按长度排序,然后按字符串:

my @sorted = sort { length $a <=> length $b 
                 || $a cmp $b } @elements

【讨论】:

  • 非常感谢,我会努力让它发挥作用,并告诉你结果如何。
猜你喜欢
  • 2021-09-28
  • 2023-03-14
  • 2013-05-04
  • 2020-05-26
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-11-13
  • 2011-04-04
相关资源
最近更新 更多