In 运算符§

有关中缀 andthen,请参阅主要文档 上下文

andthen 运算符在遇到第一个 未定义 的参数时返回 Empty,否则返回最后一个参数。最后一个参数按原样返回,根本不会检查其是否已定义。短路。左侧结果绑定到右侧的 $_,或者如果右侧是 Callable(其 count 必须为 01),则作为参数传递。

此运算符的一个方便用法是将例程的返回值别名为 $_,并对其进行额外的操作,例如打印或将其返回给调用者。由于 andthen 运算符短路,因此右侧的语句不会执行,除非左侧已定义(提示:Failure 从未定义,因此您可以使用此运算符处理它们)。

sub load-data {
    rand  > .5 or return# simulated load data failure; return Nil 
    (rand > .3 ?? 'error' !! 'good data'xx 10 # our loaded data 
}
load-data.first: /good/ andthen say "$_ is good";
# OUTPUT: «(good data is good)␤» 
 
load-data() andthen .return# return loaded data, if it's defined 
die "Failed to load data!!";

只有当子例程返回与 /good/ 匹配的任何项时,上面的示例才会打印 good data is good,并且在加载数据返回已定义的值之前,它会死掉。别名行为允许我们通过运算符传输值。

andthen 运算符与 with 语句修饰符 紧密相关,并且一些编译器将 with 编译为 andthen,这意味着这两行的行为等效

.say with 42;
42 andthen .say;