Raku 拉链运营商和空间

Jan*_*nar 4 raku

我找到了这个从多个文件中连接相同行的衬垫。如何在两行之间添加空格?

如果文件 A 中的第 1 行是蓝色,而文件 B 中的第 1 行是天空,则获得 bluesky,但需要蓝色天空。

say $_ for [Z~] @*ARGS.map: *.IO.lines;

Eli*_*sen 6

这是使用.Stron a的副作用List在元素之间添加空格:

say .Str for [Z] @*ARGS.map: *.IO.lines
Run Code Online (Sandbox Code Playgroud)

所述Z将创建2点元件List的对象,其.Str然后将字符串化。

或者更短:

.put for [Z] @*ARGS.map: *.IO.lines
Run Code Online (Sandbox Code Playgroud)

哪里.put.Str为你调用并输出它。

如果您想要其他任何东西,那么您可能可以使用.join

say .join(",") for [Z] @*ARGS.map: *.IO.lines
Run Code Online (Sandbox Code Playgroud)

将在单词之间放置逗号。

  • 而且,在上述基础上,稍长但更明确的选项是`say .join(' ') for [Z] @*ARGS.map: *.IO.lines` (2认同)

cod*_*ons 5

注意:绝对不要在任何接近真实代码的地方这样做。使用莉兹答案中的(其中一种)可读方式。

\n

如果您确实想使用与[Z~]\xe2\x80\x93 相同的结构,即由 Zip 元运算符修改的运算符,所有这些都可以在 Reduce 元运算符 \xe2\x80\x93 内进行。但它并不漂亮:

\n
say $_ for [Z[&(*~"\\x20"~*)]] @*ARGS.map: *.IO.lines\n
Run Code Online (Sandbox Code Playgroud)\n

这是它的工作原理:Z可以接受一个运算符,因此我们需要给它一个运算符来连接两个字符串,中间有一个空格。但是没有这样的内置运算符。没问题 \xe2\x80\x93 我们可以通过用[ ](中缀形式) 包围任何函数,将其转换为中缀运算符。

\n

因此,我们需要的只是一个将两个字符串连接起来并在它们之间留有空格的函数。这也不存在,但我们可以创建一个:* ~ \' \' ~ *。因此,我们应该能够将其推入中缀形式并将整个内容传递给 Zip 运算符Z[* ~ \' \' ~ *]

\n

但那不起作用。因为 Zip 并不真正期望中缀形式,所以我们需要给它一个提示,表明我们正在传入一个函数 \xe2\x80\xa6,也就是说,我们需要将函数放入可调用上下文&( ),其中让我们Z[&(* ~ \' \' ~ *)].

\n

当在中缀位置 \xe2\x80\x93 中使用时,Zip 表达式可以完成我们想要的操作,但是一旦我们将其放回到我们想要使用的 Reduce/ 运算符中,它仍然不起作用。[ ]这次,问题是由于某些可能是或可能不是错误 \xe2\x80\x93 的东西造成的,即使在 github 上与 jnthn 讨论之后也是如此之后,我仍然不确定这种行为是否是有意/正确的。

\n

具体来说,问题是 Reduction 元运算符不允许在字符串中使用空格 \xe2\x80\x93 。因此,我们需要* ~ \' \' ~ **~"\\c[space]"~*or替换*~"\\x20"~*(其中\\x20是 Unicode/ASCII 中的十六进制值 )。既然我们已经到了混淆代码的地步,我想我们不妨一路走下去。这让我们回到

\n
say $_ for [Z[&(*~"\\x20"~*)]] @*ARGS.map: *.IO.lines\n
Run Code Online (Sandbox Code Playgroud)\n

再次强调,我不建议您这样做。(而且,如果你这样做,你至少可以通过将函数保存* ~ \' \' ~ *为前一行中的命名变量来使其更具可读性,这至少会得到空格。但是,实际上,只需使用 Liz 的建议之一) 。

\n

我只是认为这为了解 Raku 奇怪的一致行为的一些更黑暗和更有趣的角落提供了一个有用的窗口。

\n