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
Run Code Online (Sandbox Code Playgroud)
pio*_*ojo 12
我假设您的输入包含数字,但由于CSV是文本格式,因此输入将作为字符串读入.min和max正在操作基于字符串排序,所以max("4", "10")是4却max("04", "10")是10.要解决这个问题,您可以Numeric在获得最小值/最大值之前将每个元素转换为(int,浮点等):
@input.map(*.Numeric).max
Run Code Online (Sandbox Code Playgroud)
或传递转换函数min,max因此每个元素都被解析为一个数字,因为它被比较:
@input.max(*.Numeric)
Run Code Online (Sandbox Code Playgroud)
第一种解决方案更适合您的情况,因为第二种解决方案是短暂的转换,在内部进行转换但仍然返回一个字符串.最后的注意事项:在正常的代码中,我会写+*或{ +$_ }意为"将X视为数字",但在这种情况下,我更喜欢明确:.Numeric.
| 归档时间: |
|
| 查看次数: |
203 次 |
| 最近记录: |