不同的操作系统使用不同的字符或字符的组合来表示换行符。每种语言都有自己的一套规则来处理这个问题。 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
,以及包含空格的任何类。