🎄 23/25. 用 Perl 6 计算总数

欢迎来到Perl 6 One-Liner Advent Calendar的23天!今年年底是人们计算年度结果的时间,Perl 6 也可以帮助解决这个问题。

今天,我们将看到一个单行程序,用于计算表格列的总数。

这是文件中的一些示例数据:

1
2
3
100.20 303.50 150.25 
130.44 1505.12 36.41
200.12 305.60 78.12

这里是为每列打印三个数字总和的代码:

1
put [Z+] lines.map: *.words

该程序打印我们需要的数字:

1
430.76 2114.22 264.78

昨天的帖子的更新中,我们知道,裸lines$*IN.lines 是一样的,所以lines.map在输入流中迭代所有行。然后将每一行拆分成由空格分隔的单词子串。

解析输入数据的作业部分已完成。我们得到了许多与输入数据行相对应的序列。对于我们的示例文件,有如下内容:

1
(("100.20", "303.50", "150.25").Seq, ("130.44", "1505.12", "36.41").Seq, ("200.12", "305.60", "78.12").Seq).Seq

现在,将每个序列的第一个元素,每个序列的第二个元素等相加起来。化简运算符zip元运算符的组合只需要四个代码字符即可完成所有工作:[Z+]

此时,我们有一个化简后的序列:

1
(430.76,2114.22,264.78).Seq

最后一个简单的步骤是使用 put 例程打印值。如果你昨天做了功课,你会知道say使用gist方法(在序列周围添加括号)来显示结果,而put只是使用Str方法打印值。

还有

让我们在脚本中添加一些字符来演示如何跳过第一列,例如,跳过包含月份名称的列:

1
2
3
Jan 100.20 303.50 150.25 
Feb 130.44 1505.12 36.41
Mar 200.12 305.60 78.12

您只需要创建一个切片并选择除第一列之外的所有列:

1
put 'Total ', [Z+] lines.map: *.words[1..*]

如您所见,我们甚至不需要自己计算列数。1..* 范围可以完成这样的工作。

这就是今天的 advent 文章的结尾,所以明天再来吧!