Raku 中的换行处理

不同的操作系统使用不同的字符或字符的组合来表示换行符。每种语言都有自己的一套规则来处理这个问题。 Raku 有以下几个规则:

  • 字符串字面量中的 \n 表示 Unicode 代码点 10。
  • say 附加到字符串的默认 nl-out 也是 \n
  • 在输出时,当在 Windows 上时,编码器默认将 \n 转换为 \r\n,当它转到文件,进程或终端时(但它不会在套接字上执行此操作)。
  • 在输入时,在任何平台上,解码器默认将 \r\n 标准化为 \n,以便从文件,进程或终端(同样不是套接字)输入。
  • 以上两点一起意味着你可以 - 把套接字编程放在一边 - 期望永远不会在你的程序中看到 \r\n(这也是许多其他语言的工作原理)。
  • :$translate-nl 命名参数存在于控制此转换的各个位置,例如,在 Proc::Async.newProc::Async.Supply 中。
  • 正则表达式语言中的 \n 是合乎逻辑的,并且匹配 \r\n

您可以通过在创建该句柄时设置 :nl-out 属性来更改特定句柄的默认行为。

my $crlf-out = open(IO::Special.new('<STDOUT>'), :nl-out("\\\n\r"));
$*OUT.say: 1;     #OUTPUT: «1␤» 
$crlf-out.say: 1; #OUTPUT: «1\␤␍» 

在这个例子中,我们通过使用 IO::Special 将标准输出复制到新句柄,我们在字符串的末尾附加一个 \,然后是换行符 和回车符 ; 我们打印到该句柄的所有内容都会在行尾添加这些字符,如图所示。

在正则表达式中,\n 是根据逻辑换行符的Unicode定义定义的。它会匹配 ., 还有 \v,以及包含空格的任何类。