在正则表达式中§

有关字符串的开头和结尾,请参阅主要文档在上下文中

^ 锚点仅匹配字符串的开头

say so 'karakul'  ~~ /  raku/;    # OUTPUT: «True␤» 
say so 'karakul'  ~~ /^ raku/;    # OUTPUT: «False␤» 
say so 'rakuy'    ~~ /^ raku/;    # OUTPUT: «True␤» 
say so 'raku'     ~~ /^ raku/;    # OUTPUT: «True␤»

$ 锚点仅匹配字符串的结尾

say so 'use raku' ~~ /  raku  /;   # OUTPUT: «True␤» 
say so 'use raku' ~~ /  raku $/;   # OUTPUT: «True␤» 
say so 'rakuy'    ~~ /  raku $/;   # OUTPUT: «False␤»

您可以组合两个锚点

say so 'use raku' ~~ /^ raku $/;   # OUTPUT: «False␤» 
say so 'raku'     ~~ /^ raku $/;   # OUTPUT: «True␤»

请记住,^ 匹配字符串的开头,而不是的开头。同样,$ 匹配字符串的结尾,而不是的结尾。

以下是一个多行字符串

my $str = chomp q:to/EOS/; 
   Keep it secret
   and keep it safe
   EOS
 
# 'safe' is at the end of the string 
say so $str ~~ /safe   $/;   # OUTPUT: «True␤» 
 
# 'secret' is at the end of a line, not the string 
say so $str ~~ /secret $/;   # OUTPUT: «False␤» 
 
# 'Keep' is at the start of the string 
say so $str ~~ /^Keep   /;   # OUTPUT: «True␤» 
 
# 'and' is at the start of a line -- not the string 
say so $str ~~ /^and    /;   # OUTPUT: «False␤»

在要避免的陷阱中§

有关^ 花括号,请参阅主要文档在上下文中

在编写小代码块时,使用 ^ 花括号可以节省大量时间和空间。例如

for 1..8 -> $a$b { say $a + $b}

可以缩短为

for 1..8 { say $^a + $^b}

当人们想要为变量使用更复杂的名称,而不仅仅是一个字母时,就会出现问题。^ 花括号能够使位置变量乱序并按您想要的任何名称命名,但会根据变量的 Unicode 顺序分配值。在上面的示例中,我们可以交换 $^a$^b 的位置,并且这些变量将保持其位置值。这是因为 Unicode 字符“a”在字符“b”之前。例如

# In order 
sub f1 { say "$^first $^second"}
f1 "Hello""there";    # OUTPUT: «Hello there␤» 
# Out of order 
sub f2 { say "$^second $^first"}
f2 "Hello""there";    # OUTPUT: «there Hello␤» 

由于允许将变量称为任何名称,因此如果您不习惯 Raku 处理这些变量的方式,则可能会导致一些问题。

# BAD NAMING: alphabetically `four` comes first and gets value `1` in it: 
for 1..4 { say "$^one $^two $^three $^four"}    # OUTPUT: «2 4 3 1␤» 
 
# GOOD NAMING: variables' naming makes it clear how they sort alphabetically: 
for 1..4 { say "$^a $^b $^c $^d"}               # OUTPUT: «1 2 3 4␤» 

变量中的§

有关^ 标点符号的更多信息,请参阅上下文中的主要文档

^ 标点符号声明了块或子例程的形式位置参数;也就是说,$^variable 形式的变量是一种占位符变量。它们可以在裸块中使用,以声明该块的形式参数。因此,代码中的块

my @powers-of-three = 1,3,9100;
say reduce { $^b - $^a }0|@powers-of-three;
# OUTPUT: «61␤»

有两个形式参数,即 $a$b。请注意,即使 $^b 在代码中出现在 $^a 之前,$^a 仍然是该块的第一个形式参数。这是因为占位符变量按 Unicode 顺序排序。

尽管几乎可以使用任何有效的标识符作为占位符变量,但建议使用简短的名称或可以按正确顺序轻松理解的名称,以避免读者感到惊讶。

普通块和子例程也可以使用占位符变量,但前提是它们没有显式的参数列表。

sub say-it    { say $^a} # valid 
sub say-it()  { say $^a} # invalid 
              { say $^a} # valid 
-> $x$y$x { say $^a} # invalid 

占位符变量不能具有类型约束或单个大写字母的变量名(不允许这样做是为了能够捕获某些 Perl 主义)。

^ 标点符号可以与任何符号组合以创建带有该符号的占位符变量。该符号将具有其正常的语义效果,如符号表中所述。因此,@^array%^hash&^fun 都是有效的占位符变量。