繁体   English   中英

为什么`my $x = if (0) {1} else {2}` 不起作用?

[英]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 是一个语句。
  • 语句的返回值。
  • assignment =明确禁止右侧的语句,因为它只接受表达式类中的内容。
  • 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM