Perl 跳出 If 语句

标签 perl if-statement break control-flow

这个问题刚刚出现:如何打破 if 语句?我有一个很长的 if 语句,但有一种情况我可以尽早摆脱它。

在循环中我可以这样做:

while (something ) {
    last if $some_condition;
    blah, blah, blah
    ...
}

但是,我可以对 if 语句执行同样的操作吗?

if ( some_condition ) {
    blah, blah, blah
    last if $some_other_condition; # No need to continue...
    blah, blah, blah
    ...
}

我知道我可以将 if 语句放入一个 block 中,然后我可以跳出该 block :

{
    if ( some_condition ) {
        ...
        last if $some_other_condition; # No need to continue...
        blah, blah, blah
        ...
    }
}

或者,我可以创建一个子例程(以编程方式可能更好):

if ( some_condition ) {
    run_subroutine();
}

sub run_subroutine {
    blah, blah, blah
    return if $some_other_condition;
    blah, blah, blah
    ...
}

但是有什么方法可以退出 if 条件吗?

<小时/>

分辨率

出现这个问题是因为我正在帮助某人编写代码。在相当长的 if 语句中,还嵌入了其他几个 if 语句。代码看起来像这样:

 if ( $condition1 ) {
    blah, blah, blah;
    if ( not $condition2 ) {
       blah, blah, blah;
       if ( not $condition3 ) {
          blah, blah, blah;
       }
    }
}

我认为这样做可以使整个事情更具可读性:

if ( $condition1 ) {
    last if $condition2;
    blah, blah, blah;
    last if $condition3;
    blah, blah, blah;
}

这表明 if 语句的正常流程是标准的,但在某些条件下,if 语句会提前退出 - 很像使用 last nextwhilefor 循环中退出循环。

我喜欢mpapec's使用标签的解决方案——即使我不使用标签本身。标签是我的 if 的描述:

IF-UNDER-CONDITION1:
{
    if ( $condition1 ) {
        last if $condition2;
        blah, blah, blah;
        last if $condition3;
        blah, blah, blah;
    }
}

虽然这不是一种标准的编码技术,但代码的流程足够明显,以至于典型的低级 Perl 开发人员(在我离开后必须维护此代码的开发人员)可以弄清楚代码在做什么并维护它。他们甚至可能在这个过程中学到一些东西。

最佳答案

您可以使用basic block它受 lastnextredo 的影响,因此可能会中断。

if ($condition) {EXIT_IF:{

   last EXIT_IF; # break from code block

   print "never get's executed\n";
}}
<小时/>
EXIT_IF: {
  if ($condition) {

     last EXIT_IF; # break from code block

     print "never get's executed\n";
  }
}

关于Perl 跳出 If 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17053666/

相关文章:

Java:调用方法的 "Break"循环?

linux - 从文件中 Grep 文本并打印以上以模式开头的行

perl - 我可以将 Strawberry Perl 嵌入到 VC++ 6.0 编译的应用程序中,或者在编译器不匹配的情况下使用 Inline::C 吗?

multithreading - 为什么 URI 对象不能定位方法 "scheme"?

java - java反编译输出中的标签位置

python - 如何使用打开的文件句柄中断 Python 生成器

perl - perl 信号 INT 的问题

javascript - 检查空/空/未定义的更好方法

PowerShell:如何检查为用户密码输入了多少位数字

javascript - 传递参数是 if/else 决策的最佳解决方案