在正则表达式中§
有关字符串的开头和结尾,请参阅主要文档在上下文中
^
锚点仅匹配字符串的开头
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 = chomp# 'safe' is at the end of the stringsay so ~~ /safe $/; # OUTPUT: «True»# 'secret' is at the end of a line, not the stringsay so ~~ /secret $/; # OUTPUT: «False»# 'Keep' is at the start of the stringsay so ~~ /^Keep /; # OUTPUT: «True»# 'and' is at the start of a line -- not the stringsay so ~~ /^and /; # OUTPUT: «False»
在要避免的陷阱中§
有关^ 花括号,请参阅主要文档在上下文中
在编写小代码块时,使用 ^
花括号可以节省大量时间和空间。例如
for 1..8 -> ,
可以缩短为
for 1..8
当人们想要为变量使用更复杂的名称,而不仅仅是一个字母时,就会出现问题。^
花括号能够使位置变量乱序并按您想要的任何名称命名,但会根据变量的 Unicode 顺序分配值。在上面的示例中,我们可以交换 $^a
和 $^b
的位置,并且这些变量将保持其位置值。这是因为 Unicode 字符“a”在字符“b”之前。例如
# In ordersub f1f1 "Hello", "there"; # OUTPUT: «Hello there»
# Out of ordersub f2f2 "Hello", "there"; # OUTPUT: «there Hello»
由于允许将变量称为任何名称,因此如果您不习惯 Raku 处理这些变量的方式,则可能会导致一些问题。
# BAD NAMING: alphabetically `four` comes first and gets value `1` in it:for 1..4 # OUTPUT: «2 4 3 1»# GOOD NAMING: variables' naming makes it clear how they sort alphabetically:for 1..4 # OUTPUT: «1 2 3 4»
变量中的§
有关^ 标点符号的更多信息,请参阅上下文中的主要文档
^
标点符号声明了块或子例程的形式位置参数;也就是说,$^variable
形式的变量是一种占位符变量。它们可以在裸块中使用,以声明该块的形式参数。因此,代码中的块
my = 1,3,9…100;say reduce , 0, |;# OUTPUT: «61»
有两个形式参数,即 $a
和 $b
。请注意,即使 $^b
在代码中出现在 $^a
之前,$^a
仍然是该块的第一个形式参数。这是因为占位符变量按 Unicode 顺序排序。
尽管几乎可以使用任何有效的标识符作为占位符变量,但建议使用简短的名称或可以按正确顺序轻松理解的名称,以避免读者感到惊讶。
普通块和子例程也可以使用占位符变量,但前提是它们没有显式的参数列表。
sub say-it # validsub say-it() # invalid# valid-> , , # invalid
占位符变量不能具有类型约束或单个大写字母的变量名(不允许这样做是为了能够捕获某些 Perl 主义)。
^
标点符号可以与任何符号组合以创建带有该符号的占位符变量。该符号将具有其正常的语义效果,如符号表中所述。因此,@^array
、%^hash
和 &^fun
都是有效的占位符变量。