In 运算符§

有关 infix notandthen,请参阅主要文档 在上下文中

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

乍一看,notandthen 似乎与 orelse 运算符相同。区别很微妙:notandthen 在遇到 defined 项(不是最后一项)时返回 Empty,而 orelse 返回该项。换句话说,notandthen 是在项目未定义时采取行动的一种手段,而 orelse 是获取第一个已定义项目的一种手段

sub all-sensors-down     { [notandthen|@_True             }
sub first-working-sensor { [orelse]     |@_'default sensor' }
 
all-sensors-down NilNilNil
  and say 'OMG! All sensors are down!'# OUTPUT:«OMG! All sensors are down!␤» 
say first-working-sensor NilNilNil# OUTPUT:«default sensor␤» 
 
all-sensors-down Nil42Nil
  and say 'OMG! All sensors are down!'# No output 
say first-working-sensor Nil42Nil;  # OUTPUT:«42␤» 

notandthen 运算符与 without 语句修饰符 密切相关,一些编译器将 without 编译为 notandthen,这意味着这两行的行为相同

sub good-things { fail }
 
'boo'.say without good-things;
good-things() notandthen 'boo'.say;