Raku 中的换行处理
不同的操作系统使用不同的字符或字符的组合来表示换行符。每种语言都有自己的一套规则来处理这个问题。 Raku 有以下几个规则:
- 字符串字面量中的
\n
表示 Unicode 代码点 10。 - 由
say
附加到字符串的默认 nl-out 也是\n
。 - 在输出时,当在 Windows 上时,编码器默认将
\n
转换为\r\n
,当它转到文件,进程或终端时(但它不会在套接字上执行此操作)。 - 在输入时,在任何平台上,解码器默认将
\r\n
标准化为\n
,以便从文件,进程或终端(同样不是套接字)输入。 - 以上两点一起意味着你可以 - 把套接字编程放在一边 - 期望永远不会在你的程序中看到
\r\n
(这也是许多其他语言的工作原理)。 - :$translate-nl 命名参数存在于控制此转换的各个位置,例如,在 Proc::Async.new 和 Proc::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
,以及包含空格的任何类。