Perl为何未按数值顺序排序数字?如何解决该异常?
问题原因
Perl 默认的sort函数是按字符串字典序排序,不是数值大小排序。比如输入里的"10"和"8",字符串比较时会先看第一个字符:"1"的ASCII码比"8"小,所以"10"会排在"8"前面。这就导致你取排序后数组的最后一个元素时,拿到的是字符串序的“最大值”8,而非真正的数值最大值10,最终计算结果错误。
另外还有一个小问题:你用foreach $x (@sorted)循环时,$x是数组元素的副本,修改$x不会改变原数组@sorted的内容,所以最后打印的还是原排序后的数组,不是乘过之后的结果。
修复方法
方法1:修正排序逻辑,用数值排序
把默认的字符串排序改成数值排序,同时修正循环里的元素修改问题:
print("input numbers: "); my $nums = <STDIN>; my @converted = split(' ', $nums); # 用数值比较运算符<=>实现升序排序 my @sorted = sort { $a <=> $b } @converted; my $multi = $sorted[-1]; # 用$_遍历($_是数组元素的别名,修改会直接改变原数组) foreach (@sorted) { $_ = $_ * $multi; } print("final: "); print join(', ', @sorted);
方法2:直接找最大值(无需排序,更高效)
如果不需要排序结果,只是要最大值的话,用List::Util模块的max函数更直接,记得要先引入模块:
use List::Util qw(max); print("input numbers: "); my $nums = <STDIN>; my @converted = split(' ', $nums); # 直接获取数组的数值最大值 my $multi = max(@converted); foreach (@converted) { $_ = $_ * $multi; } print("final: "); print join(', ', @converted);
你之前尝试min/max无效,大概率是没加use List::Util qw(max);这句引入模块的代码,Perl不会自动加载这个模块,必须显式声明。
内容的提问来源于stack exchange,提问作者BKN
相关产品推荐
相关产品推荐

