不同的操作系统使用不同的字符或它们的组合来表示换行。每种语言都有自己的规则来处理这个问题。Raku 有以下规则
字符串文字中的
\n
表示 Unicode 代码点 10。默认的 nl-out(由 say 附加到字符串)也是
\n
。在输出时,当在 Windows 上时,编码器默认情况下会将
\n
转换为\r\n
,当它要写入文件、进程或终端时(但是,它不会在套接字上执行此操作)。在输入时,无论在哪个平台上,解码器默认情况下会将来自文件、进程或终端(再次强调,不是套接字)的输入中的
\r\n
规范化为\n
。以上两点共同意味着,除了套接字编程之外,您在程序中永远不会看到
\r\n
(这也是许多其他语言的工作方式)。
名为
:$translate-nl
的命名参数存在于多个地方,用于控制这种转换,例如,在Proc::Async.new
和Proc::Async.Supply
中。在正则表达式 语言中,
\n
是逻辑的,它将匹配\r\n
。
您可以通过在创建特定句柄时设置:nl-out
属性来更改该句柄的默认行为。
my = open(IO::Special.new('<STDOUT>'), :nl-out("\\\n\r"));.say: 1; # OUTPUT: «1».say: 1; # OUTPUT: «1\␍»
在这个例子中,我们使用IO::Special
将标准输出复制到一个新的句柄,我们在字符串末尾追加了一个\
,后面跟着一个换行符
和一个回车符␍
;我们打印到该句柄的所有内容都将在行尾获得这些字符,如所示。
在正则表达式中,\n
是根据Unicode 对逻辑换行的定义 来定义的。它将匹配.
以及\v
,以及包含空格的任何类。