如何解决Perl将表达式“ {做{…}”作为
my $x = do { 3; } if 1; say $x # works
my $x = (do { 3; } if 1); say $x # syntax error
为什么?如果do块是一个表达式,为什么不能加上括号?如果不是,那么第一个解析如何?
解决方法
用于流量控制(if BLOCK
)的compound statement以及带有 statement修饰符的变量(在此使用后缀if
)不能出现在括号内。
此限制很有意义,因为这样的语句may or may not返回一个值
if
仅在条件为true时执行一次 if 语句。
(原始重点)
旁注。第一个示例运行时没有警告,但具有未定义行为,必须避免。从Statement Modifiers in perlsyn
部分的末尾开始注意:用语句修饰符条件或循环构造(例如,{{1 }})是未定义。
my
变量的值可以是state
,任何先前分配的值或任何其他值。不要依赖它Perl的未来版本可能会与您尝试的Perl版本有所不同。这是龙。
(原始重点)
任何此类实例均应重写,our
有一个policy for it,使查找它们更加容易
不是问题do
,而是后缀if
。该后缀不能出现在括号内:
$ perl -E 'my $x = ( 1 if 1); say $x'
syntax error at -e line 1,near "1 if"
Execution of -e aborted due to compilation errors.
相反,您可以在分支之一中将条件运算符?:
与do
一起使用:
$ perl -E 'my $x = ( time % 2 ? do { 1 } : () ); say $x'
,
my $x = do { 3; } if 1;
实际上等于
( my $x = do { 3; } ) if 1;
请注意,您不应有条件地执行my
。 (更确切地说,您不应使用尚未执行的my
变量。从技术上来说,您的代码是可以的,因为总是在使用my
之前执行$x
。)>
由语句修饰符(my $x = do { ... }
)修改的表达式(if 1
)是一条语句。
括号内必须是表达式,而不是声明。
你不能做
-
( $x = 3; )
-
( sub f { } )
-
( if (f()) { g() } )
-
( g() if f(); )
-
( g() if f() )
您明白了。
, if 1
是声明修饰符。 my $x = do { 3; }
是一个声明; do { 3; }
是表达式。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。