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).
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)