刚出现这个问题:我如何突破if语句?我有一个很长的if语句,但有一种情况我可以在早期就突破它。
在循环中,我可以这样做:
while (something ) { last if $some_condition; blah,blah,blah ... }
但是,我可以使用if语句执行相同的操作吗?
if ( some_condition ) { blah,blah last if $some_other_condition; # No need to continue... blah,blah ... }
我知道我可以将if语句放在一个块中,然后我可以突破块:
} if ( some_condition ) { ... last if $some_other_condition; # No need to continue... blah,blah ... } }
或者,我可以创建一个子程序(可能以编程方式更好):
if ( some_condition ) { run_subroutine(); } sub run_subroutine { blah,blah return if $some_other_condition; blah,blah ... }
但是,无论如何退出if条件?
解析度
问题出现了,因为我正在用他们的代码帮助某人。在相当长的if语句中,嵌入了其他几个if语句。代码看起来像这样:
if ( $condition1 ) { blah,blah; if ( not $condition2 ) { blah,blah; if ( not $condition3 ) { blah,blah; } } }
我认为通过这样做可以使整个事情更具可读性:
if ( $condition1 ) { last if $condition2; blah,blah; last if $condition3; blah,blah; }
这表明if语句的正常流程是标准的,但在某些条件下,if语句提前退出 – 就像在一段时间内使用last或next或for循环退出循环一样。
我喜欢mpapec’s使用标签的解决方案 – 即使我不使用标签本身。标签是我的if的描述:
IF-UNDER-CONDITION1: { if ( $condition1 ) { last if $condition2; blah,blah; last if $condition3; blah,blah; } }
虽然它不是标准的编码技术,但代码的流程足够明显,以至于典型的低级Perl开发人员(我离开后必须维护此代码的开发人员)可以弄清楚代码正在做什么并维护它。他们甚至可能在这个过程中学到一些东西
解决方法
您可以使用
basic block,它受到last,next和redo的限制,因此可能会中断。
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"; } }