如何在Perl 6中找到列表的正确最小/最大值

时间:2017-12-04 04:54:31

标签: perl6

Perl6的新手,试图找出我在这里做错了什么。问题是一个简单的校验和,它取csv

中每行的最大值和最小值的差值

它返回的最大值和最小值完全错误。对于csv中的第一行,它返回max为71,min为104,这是不正确的。

以下是repo的link以供参考,link是相应的问题。

#!/usr/bin/env perl6

use Text::CSV;

sub checksum {
    my $sum = 0;
    my @data = csv(in => "input.csv");
    for @data -> @value {
        $sum += (max @value) - (min @value);
    }
    say $sum;
}

checksum

1 个答案:

答案 0 :(得分:12)

我假设您的输入包含数字,但由于CSV是文本格式,因此输入将作为字符串读入。 maxmax("4", "10")基于字符串排序运行,因此4max("04", "10")10Numeric。要解决这个问题,您可以在获得最小值/最大值之前将每个元素转换为@input.map(*.Numeric).max (int,浮点等):

min

或将转化函数传递给max@input.max(*.Numeric) ,以便将每个元素解析为与其进行比较的数字:

+*

第一种解决方案更适合您的情况,因为第二种解决方案是短暂转换,内部转换但仍返回字符串。最后的注意事项:在普通代码中,我会写{ +$_ }.Numeric来表示“将X视为数字”,但在这种情况下,我更喜欢明确:[open('writing_file.txt', 'a+').write("{},{},{},{}\n".format(a,b,c,d)) for a,b,c,d in zip(list1,list2,list3,list4)]