[英]Why doesn't `my $x = if (0) {1} else {2}` work?
在 perl 中, $x = if (0) {1} else {2}
不起作用。
$ perl -E'$x = if (0) {1} else {2}'
syntax error at -e line 1, near "= if"
Execution of -e aborted due to compilation errors.
这是有道理的,因为if
条件不是 Perl 中的表达式。 他们是流量控制。
但是之后
my $x = do { if (0) {1} else {2} };
行得通! 为什么do BLOCK
可以接受if
条件? 但是赋值不行吗? 在上面看来,流量控制必须要么
do BLOCK
知道它的上下文此外,鉴于上面的简单事实,描述具有这种行为的 if 条件的正确方法是什么? 它是一个带有值的表达式吗? 流控制结构是否在评估后没有价值?
最后,必须对赋值进行哪些修改才能使其接受像do BLOCK
这样的if
条件。
解决问题的唯一答案和评论是 Ginnz,
总体设计是 perl 具有仅在某些上下文中有意义的关键字,并且
if
是其中之一 - 它只能是语句的开头或语句修饰符,并且它们都不能直接在=
之后有效。 这首先是解析器的区别。 除此之外,“if
语句返回什么”的考虑并不总是直观的,因此虽然您可以通过将其放在 do 块或子例程的最后一条语句中来发现这一点,但不应该鼓励使用它作为一个值。 事实上,它通常会导致错误。 – Grinnz 11 小时前
当 Ginnz 说解析器的区别时,我将其解释为意味着为了清楚起见,这并不值得追求。 =
之后有效的内容根本不是if
语句,并且没有真正的理由,只是它是这样的。
if
conditional 是一个语句。=
明确禁止右侧的语句,因为它只接受表达式类中的内容。do BLOCK
可以将语句转换为表达式。DO 块内的代码表现不同。 Perl 解释大括号内的代码并输出最后一个命令的结果。
#!/usr/bin/perl
use Data::Dumper;
my $x = do { { 1==1 } };
my $y = do { { 1==0 } };
print Dumper 1==0;
print Dumper $x;
print Dumper $y;
阅读有关 do 的更多信息: https : //perldoc.perl.org/perlfunc#do
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.