【发布时间】:2021-10-31 01:14:31
【问题描述】:
我发现这一行将多个文件的相同行连接起来。 如何在两行之间添加空格?
如果文件 A 的第 1 行是蓝色,文件 B 的第 1 行是天空,则 a 得到 bluesky, 但需要蓝天。
say $_ for [Z~] @*ARGS.map: *.IO.lines;
【问题讨论】:
标签: raku
我发现这一行将多个文件的相同行连接起来。 如何在两行之间添加空格?
如果文件 A 的第 1 行是蓝色,文件 B 的第 1 行是天空,则 a 得到 bluesky, 但需要蓝天。
say $_ for [Z~] @*ARGS.map: *.IO.lines;
【问题讨论】:
标签: raku
这是使用.Str 对List 的副作用在元素之间添加空格:
say .Str for [Z] @*ARGS.map: *.IO.lines
Z 将创建 2 个元素 List 对象,然后 .Str 将对其进行字符串化。
甚至更短:
.put for [Z] @*ARGS.map: *.IO.lines
.put 将为您调用 .Str 并输出。
如果你想要其他任何东西,那么你可以使用.join:
say .join(",") for [Z] @*ARGS.map: *.IO.lines
在单词之间加逗号。
【讨论】:
say .join(' ') for [Z] @*ARGS.map: *.IO.lines
注意:绝对不要在任何接近真实代码的地方这样做。在 Liz 的回答中使用(其中一种)可读方式。
如果您真的想要使用与[Z~] 相同的结构——即由 Zip 元运算符修改的运算符,全部在 Reduce 元运算符中——你可以。但它并不漂亮:
say $_ for [Z[&(*~"\x20"~*)]] @*ARGS.map: *.IO.lines
它是这样工作的:Z 可以接受一个运算符,所以我们需要给它一个连接两个字符串的运算符,中间有一个空格。但是没有内置这样的运算符。没问题 - 我们可以将任何函数变成一个中缀运算符,方法是用[ ](infix form)包围它。
所以我们只需要一个函数来连接两个字符串,它们之间有一个空格。 也不存在,但我们可以创建一个:* ~ ' ' ~ *。所以,我们应该能够把它塞进我们的中缀形式,并将整个东西传递给 Zip 运算符Z[* ~ ' ' ~ *]。
除非那不起作用。因为 Zip 并不真的期待一个中缀形式,我们需要给它一个提示,我们正在传递一个函数……也就是说,我们需要将我们的函数放入一个可调用的 context 中&( ),这将我们带到Z[&(* ~ ' ' ~ *)]。
该 Zip 表达式在中缀位置使用时可以满足我们的要求 - 但是一旦我们将它放回我们想要使用的 Reduce/[ ] 运算符,它仍然不起作用。这一次,问题是由于一些可能是也可能不是错误的东西——即使在discussing it with jnthn on github 之后,我仍然不确定这种行为是否是有意的/正确的。
具体来说,问题在于 Reduction 元运算符 doesn't allow whitespace – 即使在字符串中也是如此。因此,我们需要将* ~ ' ' ~ * 替换为*~"\c[space]"~* 或*~"\x20"~*(其中\x20 是 在Unicode/ASCII 中的十六进制值)。既然我们已经在混淆代码方面走了这么远,我想我们不妨一路走下去。这让我们回到
say $_ for [Z[&(*~"\x20"~*)]] @*ARGS.map: *.IO.lines
同样,我不建议您这样做。 (而且,如果你这样做了,你至少可以通过将* ~ ' ' ~ * 函数保存为上一行中的命名变量来使其更具可读性,这至少可以为你提供空格。但是,实际上,只需使用 Liz 的建议之一) .
我只是认为这提供了一个有用的窗口,可以让我们了解 Raku 奇怪的一致行为的一些更黑暗和更有趣的角落。
【讨论】: