Perl6中的字符串插值

ozz*_*zzy 5 string-interpolation perl6

我很难搞清楚为什么声明

say "\c500";
Run Code Online (Sandbox Code Playgroud)

按预期在屏幕上生成字符'Ǵ',而以下语句在编译时给出错误消息("无法识别的\ c字符"):

my $i = 500;
say "\c$i";
Run Code Online (Sandbox Code Playgroud)

即使

say "$i"; # or 'say $i.Str;' for that matter
Run Code Online (Sandbox Code Playgroud)

产生"500"(带"$ i".WHAT表示类型为Str).

jjm*_*elo 6

您将不得不使用$i.chr,这将在此处记录.\c在字符串中特别处理,似乎不承认任何不是文字的东西.

  • 谢谢你的解决方法.与此同时,我的概念理解可能已经取得了一些进展.我猜这个\ c [...]构造也是一个字符串插值构造,其处理先于$ i,导致冲突.最初,我认为\ c [...]由say函数处理,但似乎并非如此,因为`'''c500'`只是产生`\ c500`. (2认同)
  • `\ c500`是一个转义序列,有点像`\n`.在双引号字符串中,由于方法调用interpolate,`$ i.chr()`也会进行插值. (2认同)

Bra*_*ert 5

Perl 6中的字符串文字解析器是一种特定于域的语言.

基本上你写的东西与其他语言类似地编译.

"abc$_"
Run Code Online (Sandbox Code Playgroud)
&infix:«~»('abc',$_.Str)
Run Code Online (Sandbox Code Playgroud)

在这种情况下\c500,您可以将其视为编译时常量.

"\c500"
Run Code Online (Sandbox Code Playgroud)
(BEGIN 500.chr)
Run Code Online (Sandbox Code Playgroud)

实际上它更像是:

(BEGIN 500.HOW.find_method_qualified(Int,500,'chr').(500))
Run Code Online (Sandbox Code Playgroud)

除了字符串文字的编译器实际上尝试将其编译为抽象语法树,但是由于没有添加代码来处理这种情况,因此无法编译\c.
即使有,\c也有效地编译为在BEGIN时间运行,这是之前$_有一个值.


\c用于超过.chr

"\c9" eq "\c[TAB]" eq "\cI" eq "\t"
Run Code Online (Sandbox Code Playgroud)

(注意,\cI表示在posix平台上键入Cntrl+ Alt+ 可获得的字符i)

那么这些应该\c$_编译到哪个?

$_.chr
$_.parse-names
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.index($_).succ.chr
Run Code Online (Sandbox Code Playgroud)

如果您愿意.chr,可以将其写为以下之一.(在允许的地方添加空格)

"abc$_.chr( )def"
"abc{ $_.chr }def"
"abc{ .chr }def"
'abc' ~ $_.chr ~ 'def'
Run Code Online (Sandbox Code Playgroud)