我想更改一个变量但是如果第一个条件为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)
我知道命令最后和接下来,但据我了解这些命令,它们可以用于退出循环。
知道如何为这个问题写一个简单漂亮的代码吗?
感谢任何提示。
答案 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>
很大程度上取决于cond2
,cond3
和do 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 $_;
}
}
}