Perl6的新手,试图找出我在这里做错了什么。问题是一个简单的校验和,它取csv
中每行的最大值和最小值的差值它返回的最大值和最小值完全错误。对于csv中的第一行,它返回max为71,min为104,这是不正确的。
#!/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
答案 0 :(得分:12)
我假设您的输入包含数字,但由于CSV是文本格式,因此输入将作为字符串读入。 max
和max("4", "10")
基于字符串排序运行,因此4
为max("04", "10")
,10
为Numeric
。要解决这个问题,您可以在获得最小值/最大值之前将每个元素转换为@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)]
。