Perl:如何应对几个条件

时间:2014-10-02 09:48:23

标签: perl if-statement

我想更改一个变量但是如果第一个条件为true则分别跳转到if-block的末尾,什么都不做。这个伪代码显示了我想要的内容:

if ( $x =~ /^\d{4}$/ ) {  # first condition
    $x = $x;
} 
elsif ( cond2 ) {         # second condition
    do something with $x;
}
elsif ( cond3  ) {        # third condition
    do something with $x;
}

我不喜欢上面的代码,因为我发现将变量赋给自己很奇怪。避免这种自我分配的另一种解决方案是:

if ( $x !~ /^\d{4}$/ ) {
    if ( cond2 ) {            # second condition
        do something with $x;
    }
    elsif ( cond3  ) {        # third condition
        do something with $x;
    }
}

我对此代码不喜欢的是它是嵌套的(使它变得复杂)。我想有这样的事情:

if ( $x =~ /^\d{4}$/ ) {  # first condition
    stop here and go to the end  of the if block (END)
} 
elsif ( cond2 ) {         # second condition
    do something with $x;
}
elsif ( cond3  ) {        # third condition
    do something with $x;
} (END)

我知道命令最后接下来,但据我了解这些命令,它们可以用于退出循环。

知道如何为这个问题写一个简单漂亮的代码吗?

感谢任何提示。

3 个答案:

答案 0 :(得分:5)

你错了if-else是如何运作的。

你写的地方

if ( $x =~ /^\d{4}$/ ) {  # first condition
    stop here and go to the end  of the if block (END)

......这正是所做的

这(你写的):

if ( $x =~ /^\d{4}$/ ) {  # first condition
    $x = $x;
} 
elsif ( cond2 ) {         # second condition
    do something with $x;
}
elsif ( cond3  ) {        # third condition
    do something with $x;
}

与此相同

if ( $x =~ /^\d{4}$/ ) {  # first condition
    # do nothing
} 
elsif ( cond2 ) {         # second condition
    do something with $x;
}
elsif ( cond3  ) {        # third condition
    do something with $x;
}

当你明白这一点时,你想要的东西可能看起来更明显。

答案 1 :(得分:1)

您可以使用basic block退出代码

BLOCK: {

  if ( $x =~ /^\d{4}$/ ) {  # first condition
      # stop here and go to the end  of the if block (END)
      last BLOCK;
  } 
  elsif ( cond2 ) {         # second condition
      do something with $x;
  }
  elsif ( cond3  ) {        # third condition
      do something with $x;
  }
}

但是因为你有elsifs,你可以省略第一个条件的代码,这会产生同样的效果。

答案 2 :(得分:0)

您可能希望将for用作 topicaliser ,这会缩短您的正则表达式匹配,并允许您使用last跳过整个块。< / p>

很大程度上取决于cond2cond3do something with $x的样子,但这样的事情可以发挥作用

for ($x) {
   last if /^\d{4}$/;
   if ( cond2 ) {
       do something with $_;
   }
   elsif ( cond3  ) {
       do something with $_;
   }
}

或保留嵌套并允许unless作为正则表达式模式匹配现在要短得多

for ($x) {
   unless (/^\d{4}$/) {
      if ( cond2 ) {
          do something with $_;
      }
      elsif ( cond3  ) {
          do something with $_;
      }
   }
}