Perl “do { ... } if ...” 作为表达式

usr*_*etc 3 syntax perl expression

my $x = do { 3; } if 1; say $x # works

my $x = (do { 3; } if 1); say $x # syntax error

怎么来的?如果 do 块是一个表达式,为什么不能用括号括起来呢?如果不是,第一个如何解析?

zdi*_*dim 8

用于流控制 ( ) 的复合语句if BLOCK以及带有语句修饰符(此处使用的后缀if)的复合语句不能出现在括号内。

这个限制是有道理的,因为这样的语句可能会也可能不会返回一个值

if且仅当条件为真时才执行语句一次。

(原文重点)


旁注。第一个示例在没有警告的情况下运行,但它具有未定义的行为,这是必须避免的。从perlsyn 中的语句修饰符部分的末尾

注意: a mystateour使用语句修饰符条件或循环构造(例如,my $x if ...)修改的行为是undefinedmy变量的值可能是undef,任何先前分配的值,或者可能是其他任何值。不要依赖它。未来版本的 perl 可能会做一些与您尝试使用的 perl 版本不同的事情。这里是龙。

(原文重点)

任何此类实例都应重写,并Perl::Critic为其制定策略,以便更容易找到它们